- ベストアンサー
VBがオブジェクト指向言語でない理由
- VBはオブジェクト指向ではないのか?その理由について解説します
- VBにはオブジェクト指向言語の要件が一部備わっていますが、真のオブジェクト指向とは異なるとされています
- VBと他のオブジェクト指向言語(例:JAVA)との違いについて考察します
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>>50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます > >ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。 コントロールを作成する場合などは、このぐらいの数が相手になりますよ。 たとえば、(Delphiの場合ですが、)エディットボックスを継承して、半角アルファベットしか入らないエディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうちでオーバーライドするのは、キーが押されたときのメソッドだけになります。
その他の回答 (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"が委譲を示すというのが良く判りません。 そして「委譲」は多態性とどう違うのでしょうか?
- arata
- ベストアンサー率49% (139/279)
さきに誤っておきます。多態性(多様性)は、implementsでサポートされたもので、同じメソッド(やプロパティ)で違った動作をさせるもので、どちらかと言うと継承よりも多態性をサポートしたのがImplementsですね。 > 親Object.Method >と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。 これには、異議ありです。 1行ですむから継承があるのではなくて、継承が言語としてサポートされていないので、この1行を書いて擬似的に継承を行っているのではないですか? 継承がサポートされていれば、親クラスと同じであるものについては、この1行はいらないのではありませんか? コーディング上も10や20のメソッドであれば、いいのですが、50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます。
お礼
追加回答ありがとうございます。 つまりVBのimplementsで実現できるのは継承ではなく、多態性であり、その違いはメンバをその機能も併せて引き継ぐか、名称だけ引き継いで別の機能を持たせるか、の違いである、と理解したのですが……。合ってますか? >1行ですむから継承があるのではなくて、継承が言語としてサポートされて >いないので、この1行を書いて擬似的に継承を行っているのではないですか? 疑似オブジェクト指向……ということですか? >50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。
- arata
- ベストアンサー率49% (139/279)
VB6は、継承と多態性(多様性)がサポートされていません。 VB6のImplementsステートメントは、元のクラスのインタフェースのテンプレートを作成するもので、継承ではありません。 継承は、親クラスと同じものについては、子供側で記述しなければ、親のものが使用されますが、VB6のImplementsでは、親と同じ名前のメソッドやプロパティが記述されていない場合、エラーとなります。 実際には、親と同じ動作でいいメソッド(やプロパティ)の場合でも、親と同じロジックを子供でも記述するか、子供側のクラスのInitializeで親クラスのオブジェクトを生成しておいて、親のクラスのオブジェクトのメソッド(やプロパティ)を呼んでやる必要があります。これでは、継承のおいしいところがまるっきり使えていませんね。 と言うわけで、VBは隠蔽しかできないため、本格的なオブジェクト指向言語ではないのです。
お礼
回答ありがとうございます。 >親と同じ動作でいいメソッド(やプロパティ)の場合でも、 >親と同じロジックを子供でも記述するか、子供側のクラスの >Initializeで親クラスのオブジェクトを生成しておいて、 >親のクラスのオブジェクトのメソッド(やプロパティ)を >呼んでやる必要があります なるほど、確かにImplementsステートメントではその必要がありますね。 しかし、親クラスのインスタンスさえ作成しておけば、 親Object.Method と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。また、多態性とは何でしょうか?(勉強不足ですみませんが)
お礼
またまた回答ありがとうございます。 >エディットボックスを継承して、半角アルファベットしか入らない >エディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうち >でオーバーライドするのは、キーが押されたときのメソッドだけになります なるほど、コントロールには多くのメンバが必要なんですね。 ところで、VB使用時、クラスを使ってコントロールを改変したい場合は、 1)FormのLoad時にコントロールを引数にしてクラスの初期化メソッドを実行 2)クラスの初期化メソッドで、WithEvents宣言されたオブジェクト変数に、引数として渡されたコントロールへの参照を代入 3)クラス内でオブジェクト変数のイベントプロシージャを記述(上の例ではキーが押されたときのメソッド) という手段があるのですが……。 これなら追加するメソッドは1つだけの様な気もします。といっても、この方法は新しくコントロールを作るわけでもないし、プロパティに別の機能を持たせることも出来ず、単にForm上のコントロールのイベントをクラスに記述している、というだけですが……。 やはりこの辺が非オブジェクト指向言語の所以なのでしょうかねぇ。