
一般的に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で質問しましょう!
似たような質問が見つかりました
- Java オブジェクト指向プログラミングの実践本を紹介してください 3 2022/09/19 04:56
- Visual Basic(VBA) VBでExcelの表形式の様なデザインを作りDBと連携させる。 4 2023/02/28 11:39
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- Visual Basic(VBA) Excel VBA オブジェクトマクロ 使用指定について お詳しい方教えてください。 共通エクセルフ 2 2023/03/14 17:26
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- 物理学 高1力学の運動量の問題です。問題を一通り解いたのですが、行き詰まってしまったのでご回答頂ければ嬉しい 3 2022/06/29 11:20
- PHP クラス 1 2022/08/08 15:12
- Visual Basic(VBA) クラス デフォルトプロパティの作り方 1 2022/10/23 11:41
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(vba)他のアプリケーションの右...
-
メソッドの引数にクラス名を渡す
-
EventListenerの実装について
-
オーバーライドとラッパーの違い
-
private継承はどう使う?
-
Javaでは多重継承ができない、...
-
JAVAにFTP転送をサポートし...
-
【C#】クラスのコンストラクタ...
-
このエラーメッセージの意味を...
-
JAVAでパーミッションを設定する。
-
ゲッターを使わないで変数にア...
-
オブジェクト指向のインターフ...
-
「継承されたメソッドの可視性...
-
c# この高速化の方法あり?
-
javaの「型」がよくわかりません。
-
【.NET】コンストラクタをあと...
-
VBがオブジェクト指向言語でな...
-
C#でインターフェースのプロパ...
-
抽象クラスのエラーが出ます
-
JAVA:抽象クラスとインタフェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB DLLプロジェクトについて
-
(vba)他のアプリケーションの右...
-
【C#】クラスのコンストラクタ...
-
メソッドの引数にクラス名を渡す
-
C# 「データが失なわれる可能性...
-
C#からDLLを呼びたいのですが・...
-
「IOException は対応する try ...
-
c++でのヘッダーファイルの循環...
-
ファイルパスが取得出来ない(P...
-
「ラッパークラス」の存在意義...
-
抽象クラスをJUNITでテストする...
-
ASP.NETでの共通コードの書き方...
-
interface,extend,implementの...
-
「ひとつのインターフェースで...
-
javanoリストのオブジェクト作...
-
オーバーライドとラッパーの違い
-
System.Collections.Generic.Li...
-
VBがオブジェクト指向言語でな...
-
compareToにおける「自然順序付...
-
Commons-Discovery.jarとは?
おすすめ情報