• ベストアンサー
  • 暇なときにでも

VBがオブジェクト指向言語でない理由

一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数940
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.4
  • arata
  • ベストアンサー率49% (139/279)

>>50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます > >ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。 コントロールを作成する場合などは、このぐらいの数が相手になりますよ。 たとえば、(Delphiの場合ですが、)エディットボックスを継承して、半角アルファベットしか入らないエディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうちでオーバーライドするのは、キーが押されたときのメソッドだけになります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

またまた回答ありがとうございます。 >エディットボックスを継承して、半角アルファベットしか入らない >エディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうち >でオーバーライドするのは、キーが押されたときのメソッドだけになります なるほど、コントロールには多くのメンバが必要なんですね。 ところで、VB使用時、クラスを使ってコントロールを改変したい場合は、 1)FormのLoad時にコントロールを引数にしてクラスの初期化メソッドを実行 2)クラスの初期化メソッドで、WithEvents宣言されたオブジェクト変数に、引数として渡されたコントロールへの参照を代入 3)クラス内でオブジェクト変数のイベントプロシージャを記述(上の例ではキーが押されたときのメソッド)  という手段があるのですが……。 これなら追加するメソッドは1つだけの様な気もします。といっても、この方法は新しくコントロールを作るわけでもないし、プロパティに別の機能を持たせることも出来ず、単にForm上のコントロールのイベントをクラスに記述している、というだけですが……。  やはりこの辺が非オブジェクト指向言語の所以なのでしょうかねぇ。

その他の回答 (3)

  • 回答No.3
  • leel
  • ベストアンサー率0% (0/6)

よく見るオブジェクト指向プログラミングの場合、継承と委譲は概念として区別して扱うと思います。これらは is と has として示されることがあります。 ex) A bus is a car / A car has an engine で、前述のとおり多態性と委譲があれば擬似的に継承を表せるのですが、それを言い出すと手続き型言語でも擬似的に表すのならできるので、どこかに境界を置いているのでしょう。 ですから、人によってはC++もオブジェクト指向言語としては不十分だとか言うのではないでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

>ex) A bus is a car / A car has an engine 前者はcarが親でbusが子クラス(継承を示す)のは判るんですが、 "A car has an engine"が委譲を示すというのが良く判りません。 そして「委譲」は多態性とどう違うのでしょうか?

  • 回答No.2
  • arata
  • ベストアンサー率49% (139/279)

さきに誤っておきます。多態性(多様性)は、implementsでサポートされたもので、同じメソッド(やプロパティ)で違った動作をさせるもので、どちらかと言うと継承よりも多態性をサポートしたのがImplementsですね。 > 親Object.Method >と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。 これには、異議ありです。 1行ですむから継承があるのではなくて、継承が言語としてサポートされていないので、この1行を書いて擬似的に継承を行っているのではないですか? 継承がサポートされていれば、親クラスと同じであるものについては、この1行はいらないのではありませんか? コーディング上も10や20のメソッドであれば、いいのですが、50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

追加回答ありがとうございます。 つまりVBのimplementsで実現できるのは継承ではなく、多態性であり、その違いはメンバをその機能も併せて引き継ぐか、名称だけ引き継いで別の機能を持たせるか、の違いである、と理解したのですが……。合ってますか? >1行ですむから継承があるのではなくて、継承が言語としてサポートされて >いないので、この1行を書いて擬似的に継承を行っているのではないですか? 疑似オブジェクト指向……ということですか? >50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。

  • 回答No.1
  • arata
  • ベストアンサー率49% (139/279)

VB6は、継承と多態性(多様性)がサポートされていません。 VB6のImplementsステートメントは、元のクラスのインタフェースのテンプレートを作成するもので、継承ではありません。 継承は、親クラスと同じものについては、子供側で記述しなければ、親のものが使用されますが、VB6のImplementsでは、親と同じ名前のメソッドやプロパティが記述されていない場合、エラーとなります。 実際には、親と同じ動作でいいメソッド(やプロパティ)の場合でも、親と同じロジックを子供でも記述するか、子供側のクラスのInitializeで親クラスのオブジェクトを生成しておいて、親のクラスのオブジェクトのメソッド(やプロパティ)を呼んでやる必要があります。これでは、継承のおいしいところがまるっきり使えていませんね。 と言うわけで、VBは隠蔽しかできないため、本格的なオブジェクト指向言語ではないのです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 >親と同じ動作でいいメソッド(やプロパティ)の場合でも、 >親と同じロジックを子供でも記述するか、子供側のクラスの >Initializeで親クラスのオブジェクトを生成しておいて、 >親のクラスのオブジェクトのメソッド(やプロパティ)を >呼んでやる必要があります なるほど、確かにImplementsステートメントではその必要がありますね。 しかし、親クラスのインスタンスさえ作成しておけば、  親Object.Method と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。また、多態性とは何でしょうか?(勉強不足ですみませんが)

関連するQ&A

  • オブジェクト指向言語について

    オブジェクト指向言語における、クラス継承の動作について ご教授ください。 クラスを継承する場合、extendsなどといったキーワードで継承の動きを 実現させるとおもいますが、継承とは、Aというクラスを丸々包含したBというクラスを作成することをいうのでしょうか? それとも、Aというクラス内にあるpublicやprotectedメンバのみをBというクラスに引き継ぐことをいうのでしょうか? 書籍にやサイトによっては【継承とは継承もとのprivateおよびprotecetd(に準じた)メンバを派生クラスに引き継がせる】という風に解釈できる文面で記述されているものがあります。 継承とは親クラスを拡張した子クラスを作成する と解釈できるような文面で記述された文献もあります。 伺いたいのは、クラス丸ごとを継承するのかそれともpublicおよびprotectedに準じたメンバのみを 継承するのかです。 OOPの思想や、ちょっと詳しいからといってこまごましたことを こたえてくるような方はご遠慮ください。

  • オブジェクト指向に関して。

    Javaの解説本を読んでオブジェクト指向プログラミングという物があることをしりました。その本には「オブジェクトはデータとそのデータを扱うための機能を持っている。この機能はメソッドと呼ぶ。クラスは設計図のような物で変数とメソッドから構成されている。設計図を実際に形にした物がインスタンスである。」と書いてありました。私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?  また、友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。私はプログラミングの知識が全くないのでサブルーチンという物が何なのかわからないのですが、サブルーチンとオブジェクト指向の考え方は違うような気がするのです。友人に説明して納得させるにはどうしたら良いのでしょうか? ぜひ、力を課してください。

  • オーバーロードはオブジェクト指向プログラミングの枠組みで語られるべきか

    一部の書籍やサイトでは、オーバーロードがオブジェクト指向プログラミングの特徴であるかのような記述が見受けられるのですが、私はそれに疑問を感じます。 オーバーライドはクラス・継承に関わるためOOP特有のものであると思うのですが、オーバーロードはクラスとは全く切り離して考えられるからです。 確かにオーバーロードはクラスを作るときに有用な技術ではありますが、例えばC言語のような非オブジェクト指向言語でオーバーロードが使えたとしても、それなりに機能するはずです。 ひょっとしたら 「オーバーロードもオーバーライドもポリモーフィズムだろう」 ↓ 「ポリモーフィズムといえばオブジェクト指向」 のような話の展開でしょうか(いや、さすがに無理があるか…)。 皆様はどうお考えでしょうか。 ご意見お聞かせ下さい。

  • 構造体がObjectクラスを継承していることについて

    本を読んでいましたら、構造体はObjectクラスを継承している とありました。 実際構造体を定義して使用してみると、 「ToString」メソッドが存在するなどで、継承されているのだな と思うのですが、 構造体はObjectクラスを継承しています という情報はどのように確認すれば良いのでしょうか? 同じようにクラスがどのクラスを継承していますという情報も確認できたら嬉しいです。 Structure ステートメントのヘルプを見ても載っていないように感じました。 確認方法が知りたいです。 もし宜しければ、ご回答お願い致します。

  • オブジェクト指向について

    趣味でプログラミングをしているのですが オブジェクト指向の概念がうまく理解できていないので 教えていただけませんでしょうか? 解説本などを読むと、オブジェクト指向のクラスを動物クラスを継承して犬クラスや猫クラスなどと解説してあるのですが。 どうも、僕がプログラム設計するとしっぽクラスや泣き声クラスなどといった違った動物の類似機能をまとめてのクラスをつくり各メソッドとしてしまいまっています。 動物クラスや乗り物クラスを組み合わせてプログラムを設計する事ができません。 本格的なプログラムを組む用途では無いので気にしなくても目的の機能が実装できれば問題無いと知人からは言われ(面倒なので教えたくないのかもしれませんが)そのまま来てしまいました。 最近、気になって来たので。 正しい使い方を身に着けたいと思いチャレンジしていますが、変な癖がついていて犬や猫クラスなどと思いながら設計していると思考が止まってしまいます。 そこで、下記のことを教えていただけませんでしょうか? (1)泣き声クラスなどの同機能を1つのクラスにしてしまう設計しか出来ない(発想できない)のは考え方のどこがわるいのでしょうか? (追記:一部分だけならペンギンクラス猫クラスなどと言う動物クラスの継承的な発想はできるのですが実際のプログラミングの際は動物のようなわかり易い物オブジェクトとして目に見える物体ではない事柄をオブジェクト化にする事が難しく感じるのではないかと思います。) (2)今までの小さい規模での開発なら、クラスのつくり方がおかしくても不具合は無かったのですが、どのような時に困る事があるのでしょうか?(解説などでも再利用性などと、さらっと解説されていますがイマイチぴんときません) (3)正しくオブジェクト指向がマスター出来ている方にとって、どのクラスにどのメソッド実装するか悩む事などはあるのでしょうか? また、設計で一番悩むのはどのあたりですか? (4)UMLのマスターは必須でしょうか?(現在は、なんとなくUMLぽい感じでメモ書きをつくり、えせオブジェクト指向でプログラムを組んでいます。) (5)その他アドバイスがあればお願いします。 ※乱文で問題もハッキリせず質問の整理等がうまくいっていないと思いますが1つの項目だけでも構いませんので、ご教授お願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向の教え方

    新入社員にJavaを教えているところなのですが、オブジェクト指向プログラミングをどのように教えていいか困っています。 全員がC言語研修を受講済みで、さらにJava言語も、継承やオーバーロード、例外まで一通り教えて、一応理解しています。 そこで、次のレベルとして、C言語風のプログラミング(「プログラム=関数の集まり」の考え方)から、オブジェクト指向(「プログラム=オブジェクトの集まり」の考え方)に意識改革させたいところです。 問題領域をオブジェクトの集まりとしてとらえ、そこからクラスを抽出していく、という説明がよくありますが、 「何をオブジェクトにするのか」「どのようにクラスを抽出したらいいのか」の部分を詳しく教えたいのですが、どのように説明したらいいでしょうか。また、参考になるWebサイトなどありませんでしょうか? 自分が普段作るときは、ほぼ「勘」でクラス設計していますので、それでは教えられなくて困っています。よろしくお願いします。

    • ベストアンサー
    • Java
  • 技術的に可能かどうか教えてください

    C,VBプログラマで、最近JAVAの勉強を始めたJAVA初心者です。 JAVAではクラスの継承ができるとのことですが、下記の内容が実現できるかどうか教えてください。 ウィンドウを表示するクラスを作成します。ラベルやテキストボックスそしてボタンなどを表示するようにして イベントメソッドを作成して、名前を"ClassDispWindow"とでもします。 そして、"ClassDispWindow"を継承して"ClassDispOtherWindow"と言うクラスを作った後、新たなコントロールと イベントメソッドを追加して動作させたいと思っています。 この様な事は可能でしょうか? ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向プログラミングの多態性のメリット、目的は?

    オブジェクト指向プログラミングを学んでいます。 基本概念の多態性がどうも理解できません。 メリット、目的はなんなのでしょうか? 上位クラスを継承し、 その継承されたクラスのメソッドを上書きするということと何が違うのでしょうか? 学習の参考にしている書籍の中には ”多態性を使ったオブジェクト指向プログラミングの典型例”として、 異種リスト(=上位型に下位型を代入し、一族のオブジェクトを一括管理する)を紹介しています。 多態性はこのような使用のみを目的としているのでしょうか?

  • オブジェクト指向の本当の便利な点。

    オブジェクト指向の特徴は、ある程度分かりました。 が、個人で小さなソフトを作り、できるだけ自分でプログラムを作りたいため、オブジェクト指向の利点が今ひとつ分かりません。 PHPでは、構造化でできるだけグローバル変数を減らし、関数内でも関数名+変数名という変数名にしていたので、変数の名前が重複すると言ったこともなかったし。 関数名+でない場合も、関数内では不必要な変数は値を解放していたし。 過去の資産も関数を再利用する事もよくありましたし、継承のような事もしていました。 オブジェクト指向の便利さは分かるのですが、どうも実感できないというか、その便利さを持て余しているというか。 構造化プログラミングでも、さほど問題ないし。 delphiなので、JAVAのようにオブジェクト指向(クラス)が必須という訳でもないし。 逆にクラスを作ってしまうと、メモリーから解放しないといけないので、それが少し怖いです。 で、オブジェクト指向の利点をあげるとしたら何ですか? 可能なら、上位から3つくらいを詳しく書いてください。 ソフトは大規模か小規模か、制作者は大勢か少数・個人か、それは構造化プログラミングでは無理な事なのか? オブジェクト指向の利点や特徴は、分かるのですがピンとこないというか、実感できないというか・・・。

  • VB .Netの構造体について

    構造体について教えて下さい。 クラスで構造体を作成しました。 クラスでIniファイルを読み込み、Formのボタンを押した処理の中で構造体を読み込みたいのですが、何をしても空白(Nothing)になります。 クラスの中では格納されたままなのに・・・。 違う場所で構造体を呼んだときは別の処理がいるのでしょうか? それともVB .Netの仕様なのでしょうか?