
一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、
1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる
2)Implementsステートメントでクラスの継承が出来る
と、ある程度のオブジェクト指向言語の要件を備えているように見えます。
といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。
しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。
JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。
No.4ベストアンサー
- 回答日時:
>>50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます
>
>ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。
コントロールを作成する場合などは、このぐらいの数が相手になりますよ。
たとえば、(Delphiの場合ですが、)エディットボックスを継承して、半角アルファベットしか入らないエディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうちでオーバーライドするのは、キーが押されたときのメソッドだけになります。
またまた回答ありがとうございます。
>エディットボックスを継承して、半角アルファベットしか入らない
>エディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうち
>でオーバーライドするのは、キーが押されたときのメソッドだけになります
なるほど、コントロールには多くのメンバが必要なんですね。
ところで、VB使用時、クラスを使ってコントロールを改変したい場合は、
1)FormのLoad時にコントロールを引数にしてクラスの初期化メソッドを実行
2)クラスの初期化メソッドで、WithEvents宣言されたオブジェクト変数に、引数として渡されたコントロールへの参照を代入
3)クラス内でオブジェクト変数のイベントプロシージャを記述(上の例ではキーが押されたときのメソッド)
という手段があるのですが……。
これなら追加するメソッドは1つだけの様な気もします。といっても、この方法は新しくコントロールを作るわけでもないし、プロパティに別の機能を持たせることも出来ず、単にForm上のコントロールのイベントをクラスに記述している、というだけですが……。
やはりこの辺が非オブジェクト指向言語の所以なのでしょうかねぇ。
No.3
- 回答日時:
よく見るオブジェクト指向プログラミングの場合、継承と委譲は概念として区別して扱うと思います。
これらは 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
- 回答日時:
さきに誤っておきます。
多態性(多様性)は、implementsでサポートされたもので、同じメソッド(やプロパティ)で違った動作をさせるもので、どちらかと言うと継承よりも多態性をサポートしたのがImplementsですね。> 親Object.Method
>と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。
これには、異議ありです。
1行ですむから継承があるのではなくて、継承が言語としてサポートされていないので、この1行を書いて擬似的に継承を行っているのではないですか?
継承がサポートされていれば、親クラスと同じであるものについては、この1行はいらないのではありませんか?
コーディング上も10や20のメソッドであれば、いいのですが、50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます。
追加回答ありがとうございます。
つまりVBのimplementsで実現できるのは継承ではなく、多態性であり、その違いはメンバをその機能も併せて引き継ぐか、名称だけ引き継いで別の機能を持たせるか、の違いである、と理解したのですが……。合ってますか?
>1行ですむから継承があるのではなくて、継承が言語としてサポートされて
>いないので、この1行を書いて擬似的に継承を行っているのではないですか?
疑似オブジェクト指向……ということですか?
>50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます
ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。
No.1
- 回答日時:
VB6は、継承と多態性(多様性)がサポートされていません。
VB6のImplementsステートメントは、元のクラスのインタフェースのテンプレートを作成するもので、継承ではありません。
継承は、親クラスと同じものについては、子供側で記述しなければ、親のものが使用されますが、VB6のImplementsでは、親と同じ名前のメソッドやプロパティが記述されていない場合、エラーとなります。
実際には、親と同じ動作でいいメソッド(やプロパティ)の場合でも、親と同じロジックを子供でも記述するか、子供側のクラスのInitializeで親クラスのオブジェクトを生成しておいて、親のクラスのオブジェクトのメソッド(やプロパティ)を呼んでやる必要があります。これでは、継承のおいしいところがまるっきり使えていませんね。
と言うわけで、VBは隠蔽しかできないため、本格的なオブジェクト指向言語ではないのです。
回答ありがとうございます。
>親と同じ動作でいいメソッド(やプロパティ)の場合でも、
>親と同じロジックを子供でも記述するか、子供側のクラスの
>Initializeで親クラスのオブジェクトを生成しておいて、
>親のクラスのオブジェクトのメソッド(やプロパティ)を
>呼んでやる必要があります
なるほど、確かにImplementsステートメントではその必要がありますね。
しかし、親クラスのインスタンスさえ作成しておけば、
親Object.Method
と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。また、多態性とは何でしょうか?(勉強不足ですみませんが)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
interface,extend,implementの...
-
「ラッパークラス」の存在意義...
-
デバックログの出し方
-
(vba)他のアプリケーションの右...
-
Commons-Discovery.jarとは?
-
C++で参照カウンタを実装したい...
-
「IOException は対応する try ...
-
変数名の付け方
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
レコード件数の表示
-
「インスタンス」の意味をわか...
-
サーブレットコンテキストの意...
-
VB.NETでフォーム上にExcelのよ...
-
インスタンス参照でアクセスで...
-
final修飾子を使っているのに、...
-
クラス間でのデータ参照
-
private static という変数の修飾
-
オブジェクトレベルとメタレベル
-
java 次の機能を有するメソッド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(vba)他のアプリケーションの右...
-
interface,extend,implementの...
-
VB DLLプロジェクトについて
-
「継承されたメソッドの可視性...
-
C# 「データが失なわれる可能性...
-
【C#】クラスのコンストラクタ...
-
C#でインターフェースのプロパ...
-
「ラッパークラス」の存在意義...
-
メソッドの引数にクラス名を渡す
-
VBがオブジェクト指向言語でな...
-
オーバーライドとラッパーの違い
-
デバッグ時に「Source not found」
-
スクロールバーについて
-
携帯IApplicationのsuper
-
ファイルパスが取得出来ない(P...
-
EventListenerの実装について
-
c# この高速化の方法あり? 2
-
抽象クラスが継承されているか...
-
ASP.NETでの共通コードの書き方...
-
抽象クラスをJUNITでテストする...
おすすめ情報