一般的に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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】クラスのコンストラクタ...
-
interface,extend,implementの...
-
デバッグ時に「Source not found」
-
setTextについて
-
抽象クラスをJUNITでテストする...
-
抽象クラスとインタフェースの...
-
Excel vbaのプログラムでガンマ...
-
VB DLLプロジェクトについて
-
cocoa、objective-cのクラスを...
-
インタフェースのstatic変数(Java)
-
インナークラスについて
-
単体テストのテストケースにて...
-
C#からDLLを呼びたいのですが・...
-
タイマーの作り方
-
Java StringBuilderクラスについて
-
肥大化した実装クラスを分割す...
-
インターフェースとは
-
Javaの自作例外クラスについて
-
javaのabstractの意味
-
インターフェース型の使い方が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
「継承されたメソッドの可視性...
-
インターフェースとトレイトっ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
なぜForm型にキャストするので...
-
vb.net 自作プロパティの削除に...
-
【C#】クラスのコンストラクタ...
-
委譲って何ですか?
-
interface,extend,implementの...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
C#からDLLを呼びたいのですが・...
おすすめ情報