-PR-
解決済み

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

  • 暇なときにでも
  • 質問No.71750
  • 閲覧数859
  • ありがとう数5
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 54% (102/187)

一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、
1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる
2)Implementsステートメントでクラスの継承が出来る

と、ある程度のオブジェクト指向言語の要件を備えているように見えます。
といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。

しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。
JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル11

ベストアンサー率 49% (139/279)

>>50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます
>
>ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。

コントロールを作成する場合などは、このぐらいの数が相手になりますよ。

たとえば、(Delphiの場合ですが、)エディットボックスを継承して、半角アルファベットしか入らないエディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうちでオーバーライドするのは、キーが押されたときのメソッドだけになります。
お礼コメント
k_o_j_i

お礼率 54% (102/187)

またまた回答ありがとうございます。

>エディットボックスを継承して、半角アルファベットしか入らない
>エディットボックスを作る場合は、50個ぐらいのプロパティ、メソッドのうち
>でオーバーライドするのは、キーが押されたときのメソッドだけになります

なるほど、コントロールには多くのメンバが必要なんですね。

ところで、VB使用時、クラスを使ってコントロールを改変したい場合は、
1)FormのLoad時にコントロールを引数にしてクラスの初期化メソッドを実行
2)クラスの初期化メソッドで、WithEvents宣言されたオブジェクト変数に、引数として渡されたコントロールへの参照を代入
3)クラス内でオブジェクト変数のイベントプロシージャを記述(上の例ではキーが押されたときのメソッド)
 という手段があるのですが……。
これなら追加するメソッドは1つだけの様な気もします。といっても、この方法は新しくコントロールを作るわけでもないし、プロパティに別の機能を持たせることも出来ず、単にForm上のコントロールのイベントをクラスに記述している、というだけですが……。
 やはりこの辺が非オブジェクト指向言語の所以なのでしょうかねぇ。
投稿日時 - 2001-05-06 06:36:33

その他の回答 (全3件)

  • 回答No.1
レベル11

ベストアンサー率 49% (139/279)

VB6は、継承と多態性(多様性)がサポートされていません。

VB6のImplementsステートメントは、元のクラスのインタフェースのテンプレートを作成するもので、継承ではありません。

継承は、親クラスと同じものについては、子供側で記述しなければ、親のものが使用されますが、VB6のImplementsでは、親と同じ名前のメソッドやプロパティが記述されていない場合、エラーとなります。

実際には、親と同じ動作でいいメソッド(やプロパティ)の場合でも、親と同じロジックを子供でも記述するか、子供側のクラスのInitializeで親クラスのオブジェクトを生成しておいて、親のクラスのオブジェクトのメソッド(やプロパティ)を呼んでやる必要があります。これでは、継承のおいしいところがまるっきり使えていませんね。

と言うわけで、VBは隠蔽しかできないため、本格的なオブジェクト指向言語ではないのです。
お礼コメント
k_o_j_i

お礼率 54% (102/187)

回答ありがとうございます。

>親と同じ動作でいいメソッド(やプロパティ)の場合でも、
>親と同じロジックを子供でも記述するか、子供側のクラスの
>Initializeで親クラスのオブジェクトを生成しておいて、
>親のクラスのオブジェクトのメソッド(やプロパティ)を
>呼んでやる必要があります

なるほど、確かにImplementsステートメントではその必要がありますね。
しかし、親クラスのインスタンスさえ作成しておけば、
 親Object.Method
と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。また、多態性とは何でしょうか?(勉強不足ですみませんが)
投稿日時 - 2001-05-05 07:44:37


  • 回答No.2
レベル11

ベストアンサー率 49% (139/279)

さきに誤っておきます。多態性(多様性)は、implementsでサポートされたもので、同じメソッド(やプロパティ)で違った動作をさせるもので、どちらかと言うと継承よりも多態性をサポートしたのがImplementsですね。

> 親Object.Method
>と、1行の記述で済むのですから、継承と言っても差し障りがないように思えるんですが……。

これには、異議ありです。

1行ですむから継承があるのではなくて、継承が言語としてサポートされていないので、この1行を書いて擬似的に継承を行っているのではないですか?

継承がサポートされていれば、親クラスと同じであるものについては、この1行はいらないのではありませんか?

コーディング上も10や20のメソッドであれば、いいのですが、50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます。
お礼コメント
k_o_j_i

お礼率 54% (102/187)

追加回答ありがとうございます。
つまりVBのimplementsで実現できるのは継承ではなく、多態性であり、その違いはメンバをその機能も併せて引き継ぐか、名称だけ引き継いで別の機能を持たせるか、の違いである、と理解したのですが……。合ってますか?

>1行ですむから継承があるのではなくて、継承が言語としてサポートされて
>いないので、この1行を書いて擬似的に継承を行っているのではないですか?

疑似オブジェクト指向……ということですか?

>50や60となると面倒ですし、ソースのみとうしも悪くなってしまいます

ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。
投稿日時 - 2001-05-05 19:24:48
  • 回答No.3
レベル4

ベストアンサー率 0% (0/6)

よく見るオブジェクト指向プログラミングの場合、継承と委譲は概念として区別して扱うと思います。これらは is と has として示されることがあります。
ex) A bus is a car / A car has an engine

で、前述のとおり多態性と委譲があれば擬似的に継承を表せるのですが、それを言い出すと手続き型言語でも擬似的に表すのならできるので、どこかに境界を置いているのでしょう。

ですから、人によってはC++もオブジェクト指向言語としては不十分だとか言うのではないでしょうか。
お礼コメント
k_o_j_i

お礼率 54% (102/187)

>ex) A bus is a car / A car has an engine
前者はcarが親でbusが子クラス(継承を示す)のは判るんですが、
"A car has an engine"が委譲を示すというのが良く判りません。

そして「委譲」は多態性とどう違うのでしょうか?
投稿日時 - 2001-05-05 19:28:37
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-

特集


抽選で合計100名様にプレゼント!

ピックアップ

ページ先頭へ