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

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

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

このQ&Aに関連する最新のQ&A

A 回答 (4件)

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


>
>ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。

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

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

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

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

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

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

お礼日時:2001/05/06 06:36

よく見るオブジェクト指向プログラミングの場合、継承と委譲は概念として区別して扱うと思います。

これらは is と has として示されることがあります。
ex) A bus is a car / A car has an engine

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

ですから、人によってはC++もオブジェクト指向言語としては不十分だとか言うのではないでしょうか。
    • good
    • 1
この回答へのお礼

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

そして「委譲」は多態性とどう違うのでしょうか?

お礼日時:2001/05/05 19:28

さきに誤っておきます。

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

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

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

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

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

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

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

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

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

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

ここまで多くのメソッドを持つクラスを作成することは稀ではないかと思うのですが……。

お礼日時:2001/05/05 19:24

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



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

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

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

と言うわけで、VBは隠蔽しかできないため、本格的なオブジェクト指向言語ではないのです。
    • good
    • 1
この回答へのお礼

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

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

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

お礼日時:2001/05/05 07:44

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETをオブジェクト指向を踏めた上で勉強したい。

タイトルのとおりです。

お勧めの本やHPがありましたら教えてください。

Aベストアンサー

VB.NET の基本文法などを押さえた後、
UML を勉強されるとよいと思います。

http://www.amazon.co.jp/exec/obidos/ASIN/4881358014/503-5426373-1284717

QVB.netでフォームを継承して新しいクラスを作る方法

VB6では
Public Sub replaceForm(fromF As Form, toF As Form)

fromF.myhide
toF.myshow
...

End Sub

Form1 で
public sub myshow()
...
End Sub
public sub myhide()
...
End Sub

Form2 で
public sub myshow()
...
End Sub
Public sub myhide()
...
End Sub

として、ある関数で
  replaceForm Form1,Form2
...
replaceForm Form2,Form3
を実行、というようにしていました。

しかし、VB6ではfromFに渡す各フォームにpublic subとしてmyshow(),myhide()を書くだけでうまくいったのですが、.netでは厳密にコンパイルするためにFormクラスのメソッドとして認識されずにコンパイル時にはじかれます。

Formを継承してSuperFormクラスを作り、そのに標準のメソッドとしてmyshow,myhideメソッドを実装したいのですが、どのようにすればよいでしょうか?
よろしくお願いします。

VB6では
Public Sub replaceForm(fromF As Form, toF As Form)

fromF.myhide
toF.myshow
...

End Sub

Form1 で
public sub myshow()
...
End Sub
public sub myhide()
...
End Sub

Form2 で
public sub myshow()
...
End Sub
Public sub myhide()
...
End Sub

として、ある関数で
  replaceForm Form1,Form2
...
replaceForm Form2,Form3
を実行、というようにしていました。

しかし、VB6ではfromFに渡す各フォームにpublic subとしてmyshow(),myhide...続きを読む

Aベストアンサー

Class myForm
Overridable Sub myshow()
....
End Sub
Overridable Sub myhide()
....
End Sub
End Class

Class SuperForm
Inherits myForm
Overrides Sub myshow()
....
End Sub
Overrides Sub myhide()
....
End Sub
End Class
こう言う事でよろしいのですか?

QVB6のImplementsについて

VB6でImplementsというものがありますが、これは何に使うのでしょうか?
もしImplementsがなかったら、何に不便なのでしょうか?

VBScriptでImplementsは使えるのでしょうか。

Aベストアンサー

これを使うレベルではないのですが
「Implements VB6」でWEB照会すると
http://blogs.sqlpassj.org/masatotaniguchi/archive/2005/08/13/12756.aspx
http://jeanne.wankuma.com/tips/rule/vb6oop.html
を初めたくさん出てきます。
数個読めば、回答は載ってます。
ーー
VBScriptではそういうキーワードは無いが、VB6でVBScriptを使えばよいのではないですか。

Qvbs: オブジェクトがコレクションではありません

ネットワークサーバーのファイルをローカルにコピーするスクリプトを作成しました。
スクリプトは正しく動作しています。
このスクリプトをスタートアップフォルダに入れて、PCを起動すると
「オブジェクトがコレクションではありません」
というエラーが時々起こります。
特定のPCで起こるとか、必ず起こるといった再現性がありません。
起動時にエラーが起きた場合でも、手動でスクリプトを実行すると正しく動作します。

原因として、スクリプト起動時にネットワーク接続が確立されていないのか、他のスタートアップツールがネットワークを利用するタイミングに衝突しているのではないかと考えています。

(1)他に考えられる原因があれば、教えてください。
(2)解決方法があれば、教えてください。

以上、よろしくお願いいたします。

Aベストアンサー

たまに起こるとなると厄介ですね。
既に試されているかもしれませんが
Wscript.sleep 1000 * 10 '10秒待機
で単純に時間稼ぎをしてみるとか

Do Until ※※ = true
wscript.sleep 500
i = i + 1
if i = 3 exit do
Loop
※※の部分は
http://gallery.technet.microsoft.com/scriptcenter/8894f20c-a8ae-40f4-b96b-2a948615a2da/
のWMIで IP Address を 取得出来るまで待機して・・
などでできませんかね。
対症療法的な処理のような気がするので、どうかな?とも思えますが
思いついたのは、これぐらいです。

Qラッパークラスってインヘリタンス(継承)を使ったクラスのこと?

「それならラッパーを使えばいいよ。」っていうのをよく目にします。

ラッパー(包み込む)とは、クラスをクラスで包むということですよね?

インヘリタンスのことですよね?違いますか???

Aベストアンサー

> System.IO.Streamクラスに読み取りの機能を付けるのにSystem.IO.StreamReaderクラスでラッパーするわけですよね???
> この認識は合っていますか?

私は合っていると思います。
# 言葉の定義次第なので,違うという人が出てくるかもしれませんが。


このカテゴリの人気Q&Aランキング

おすすめ情報