一般的に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と関連する良く見られている質問

Qphpでオブジェクト指向と呼べる設計をするには・・・

phpで、なるべく同じ処理は関数化し、
ひとつの大きな処理としてまとめています。

これは、オブジェクト指向といえるのでしょうか?
オブジェクト指向とはもっと高度で汎用性が高く
たんなる関数化ではオブジェクト指向とはいえないでしょうか?

綺麗なオブジェクト指向とは一体のどようなものなのでしょうか?

どこまでオブジェクト化すれば
オブジェクト指向なのかよく分かりません。
使いまわしがきけばオブジェクト指向なのでしょうか?
他のプログラムに影響を与えなければオブジェクト指向なのでしょうか?

質問が抽象的ですが、よろしくお願いします。

Aベストアンサー

>たんなる関数化ではオブジェクト指向とはいえないでしょうか?

いえない。それは「構造化プログラミング」というものだ。プログラムを処理ごとに整理し構造化する手法だな。

オブジェクト指向は、「処理ごと」に整理するのを超え、「独立して扱える個々のプログラムの集合体」として設計する。これはクラスとして設計される。それぞれのクラスは、他のプログラムに依存せずそれぞれ単独で機能する形で設計されなければならない。そうして設計されたクラスの組み合わせによりプログラム全体を構築する。これがオブジェクト指向プログラミング。

関数は、ただ「一つの機能をまとめたもの」に過ぎない。これに対し、クラスは「機能と、値をパッケージ化」する。そのクラスに必要な機能をメソッドとして用意し、そのクラスを利用するために必要な情報をすべてメンバー変数として自身の中に保持する。そのクラスを利用するのに必要な情報は、すべて自分自身の中にある。そうした独立性のあるオブジェクトとしてプログラムを定義するのがオブジェクト指向。

ただ、PHPの場合、ちょっとしたものだとわざわざオブジェクト指向を持ち出さなくとも作れてしまうので、なかなかオブジェクト指向の考えを実践するのは難しいところがある。オレも、ちょっとしたものならまずクラスなんて定義しないで作っちまうし。すっきりと美しく作られたオブジェクト指向を理解したいなら、PHPの場合、MVCによるフレームワークを勉強するのが割と手っ取り早いんでないかと思うな。CakePHPとかZend frameworkなんかを実際に使ってみると、オブジェクト指向がどういうものか、次第にわかってくるんでないかな。

>たんなる関数化ではオブジェクト指向とはいえないでしょうか?

いえない。それは「構造化プログラミング」というものだ。プログラムを処理ごとに整理し構造化する手法だな。

オブジェクト指向は、「処理ごと」に整理するのを超え、「独立して扱える個々のプログラムの集合体」として設計する。これはクラスとして設計される。それぞれのクラスは、他のプログラムに依存せずそれぞれ単独で機能する形で設計されなければならない。そうして設計されたクラスの組み合わせによりプログラム全体を構築する。こ...続きを読む

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

タイトルのとおりです。

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

Aベストアンサー

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

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

Qオブジェクト指向設計について

オブジェクト指向設計に興味を持って、いくつかオブジェクト指向の本を読んでみたのですが、
どうもオブジェクト指向に関する基礎知識の説明ばかりで、
オブジェクト指向でどのように設計するのか、どのように生かされるのか、
肝心な部分がいまいちピンときません。

オブジェクト指向による設計に重点を置いたお薦めの書籍などありましたら是非教えてください。

Aベストアンサー

私も「オブジェクト指向のこころ」がお勧めです。
http://www.amazon.co.jp/dp/4894716844
通して読むと、オブジェクト指向の考え方が分かります。

他には下記のものもお勧めです。
「オブジェクト指向でなぜつくるのか」
http://www.amazon.co.jp/dp/4822281957/

「アジャイルソフトウェア開発の奥義」
http://www.amazon.co.jp/dp/4797347783/

「Code Complete第2版〈上〉」(6章にクラスの解説が有る)
http://www.amazon.co.jp/dp/489100455X/

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
こう言う事でよろしいのですか?

Qオブジェクト指向の特徴

プログラミングにおいて

Java言語などのオブジェクト指向とは

「クラス(設計図)からインスタンス(実体)を量産できる。」がオブジェクト指向ではないプログラミング言語との決定的な違いなのでしょうか?

またオブジェクト指向とオブジェクト指向ではない言語の決定的な違いや
実際に実務において経験した感覚的な違いなどがあれば教えてください。

インターネットに乗っていない些細なことでも構いません。

Aベストアンサー

数学の世界では、関数(写像) の引数には定義域というものがあって、範囲外の値を入力することは許されません。

しかし、定義域を変えて新しい関数を定義することはできます。

例えば対数関数 log x の場合、定義域は x>0 ですが、x=0 の時、log 0=-∞ と定義することもできます。

高校数学では、x<0 を可能にするために log|x| とすることが多いのですが、多値関数の概念を学ぶと

cosπ+i sinπ=e^(iπ)
log(-1)=i(2n-1)π

のように負の対数も定義可能になります。

オブジェクト指向の概念はこれと似ており、入力側の型や範囲を拡げて定義することで既存のプログラムの書き換えをする手間を減らそうというものです。

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を使えばよいのではないですか。

Qオブジェクト指向の利点とは?

汎用機でCOBOLのSEを10数年やってました。(今は自営業)
COBOLはプロセス型の言語といわれているのに対して
C言語はオブジェクト指向型の言語といわれています。

私はC言語やJAVAで開発したことはないのですが、
C言語、すなわちオブジェクト指向の利点ってなんでしょう?
JAVA、C言語はオブジェクト指向ですよね。

私はソフトウェア開発技術者の資格など持っていますのでオブジェクト指向の表面的な意味は分かります。
ですが実際、アプリ開発時・運用時にどのような利点があるのかがイマイチ分かりません。
「どっちでもいいんじゃないか」なんて思ってしまいます。
プロセス指向(VB、COBOL等)とオブジェクト指向(C言語、JAVA)の差異って何なんでしょう。

よろしくお願いします。

Aベストアンサー

当方は、単なる学部卒の人間ですので、もっとおおざっぱな回答を試みます。(ていうか、そういった事しか出来ないだけなんですが。)

>C言語はオブジェクト指向型の言語といわれています。

C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。で、それとは別に「非手続き型言語」が何タイプかあり、その中の一つとして、オブジェクト指向型の言語(C++やJavaやSmalltalkなど)があったものと思われます。(以上、第3世代に属する高水準言語です。)

最近も、以下のJavaカテゴリの方で、「オブジェクト指向とは何たるか?」について、回答しておきましたので(#5の所)、そちらの方も参考にされたら、と思います。

「教えて下さい☆」
http://oshiete1.goo.ne.jp/qa2864855.html

上記の過去ログ内にも書かれていますが、「オブジェクト指向の利点」の一つに、「デザインパターンを利用することが出来る」というのが挙げられます。このデザインパターンとは、手短にいえば、過去の熟練したソフト設計者の方々が、数々の試行錯誤の上に得られた、オブジェクト指向設計を行う上で定石とも言える効率的な設計手法(パターン)をまとめたものです。当初は、C++を元に作成され、一番最初に提唱した4人の方々に敬意を表して、GoFパターンとも呼ばれています。(GoFとは、Gang of Four「4人のギャング」の頭文字を取ったもの。)

現在では、この汎用的な23のデザインパターン以外にも、Javaで言えば、J2EEの技術に特化した「J2EEパターン」なるものも存在したりします。こういった事から、若手であまり設計などの経験に乏しい技術者でも、そのような便利な設計手法を利用することができ、一から過去の設計者の方々が経験した、様々な成功や失敗などの体験を繰り返すことがなくなるわけですね。(まあ、実際にはあくまでも手段であって、全部のデザインパターンを使うといったこともないですし、かなり抽象的で難しい事もあってか、逆に使用しない方がいい、といった場合もあるらしいですが。)

あとそれから、以下の書籍の15ページの所に、次のような記述があります。

「ゼロから学ぶC/C++ フリーのコンパイラで気軽に始めよう!」
(編:日経ソフトウェア編集,発行:日経BP社,2005年1月24日 第1版第1刷発行)

「(前略)いったい、オブジェクト指向プログラミングができると何がうれしいのでしょうか。端的に言えば、効率よくプログラムを開発できるようになるのです(図7)。そもそもプログラムをオブジェクトの集合体としてとらえることで、プログラムの構造がぐっと見やすくなります。2000個の変数と1000個の関数から構成した売上管理プログラムだって、わずか数十種類のクラスに整理することが可能なのです。これが開発効率を高めるのは容易に想像できるでしょう。開発時だけでなく、後からプログラムの機能を追加したり、改造を加えることも容易になります。(後略)」

この文章自体がまさに、「オブジェクト指向の利点」を言い表していますね。同じページ内にも「*19 もちろんC言語でも再利用可能なソフト部品を実現できますが、C++のクラスのほうが継承(後述)などによって、より再利用しやすい部品を作ることができます。」といった記述もあります。

最後に、現在Javaの開発においては、Strutsを始めとした「MVCフレームワーク」が主流となっていますが、これ自体もまた、実際には「MVCパターン」というデザインパターンの一種を活用したものとなっています。このことに関して、以下の過去ログでは、「それじゃあ、なぜそのような新しい技術であるフレームワークを利用するのか?」といったような質問がなされています。

「ストラッツ(Struts)って本当にいいの?」
http://oshiete1.goo.ne.jp/qa2049016.html

ここで回答された方々の内容いずれもが、まさに「オブジェクト指向の利点」となっていますね。実際に、M(Model)とV(View)とC(Controller)の3つに分けることによって、担当する部分をより明確にして、切り分けているのです。部品化による恩恵が、こういった所にも表れているわけですね。

参考URL:http://www.ascii.co.jp/books/books/detail/4-7561-4155-2.shtml

当方は、単なる学部卒の人間ですので、もっとおおざっぱな回答を試みます。(ていうか、そういった事しか出来ないだけなんですが。)

>C言語はオブジェクト指向型の言語といわれています。

C言語も、VBも、COBOLも、確か、同じ「手続き型言語」の一種ですよね。で、それとは別に「非手続き型言語」が何タイプかあり、その中の一つとして、オブジェクト指向型の言語(C++やJavaやSmalltalkなど)があったものと思われます。(以上、第3世代に属する高水準言語です。)

最近も、以下のJavaカテゴ...続きを読む

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オブジェクト指向、理解しやすい?

 最近、Javaの解説書や解説サイトを見ていて、しばしば、「Javaは完全なオブジェクト指向だから理解しやすい」といった記述を見かけます。(「プログラムが見やすくなる」とかではなく)
 Javaに限った話ではないのですが、個人的に、オブジェクト指向の概念は、プログラミング初心者の最大の関門ではないかと勝手に思っています。僕はPHPから入ったのですが、ある程度基本事項をマスターした後も、オブジェクト指向だけは長い間苦手としてきました。(最近やっと慣れてきたところです。)
 そこで伺いたいのですが、最初にやったプログラミング言語がオブジェクト指向だったという方、オブジェクト指向の概念は、

1.わかりやすかった
2.そこでつまずいた
3.特に意識せずに通り過ぎた
4.その他

いずれでしょうか?

※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

Aベストアンサー

自分は最初の言語がVB6.0とJavaでした(VB6.0は業務で、Javaは個人的に)
なので、最初の言語がオブジェクト指向かどうかは微妙な所です。
(VB6.0はオブジェクト指向言語だと思ってないので)

で、オブジェクト指向の理解については、
2.そこでつまずいた
ですね。
本に書いてある内容は別に難しくも何ともないのですが、
それが何で便利なのか?構造化プログラムとどう違うか?がよく分からなかった。
(完全に独学だったのもありますが)
これを乗り越えなくてはオブジェクト指向を理解する意味ないですから。

また、オブジェクト指向自体も、オブジェクト指向プログラミングと
オブジェクト指向設計/分析とに大きく分かれると思いますが、
それを混同していたというのもありました。
※「モノと捉える」と言いながら、一方で「インターフェース」なんてものが出てくる。
インターフェースって「モノ」なのか?…とか考えてた。

ただ、分かった時はすぐでしたね。ちょっとずつ分かった、という感じではなかった。
真っ暗な部屋でドアが中々見つからなかったのに、部屋の明かりを点けたらそれまでが嘘のように分かった。
そんな感じです。
UMLで設計の勉強したのと、デザインパターンをかじりだしたのがきっかけです。
ずいぶん回り道した気がする…

オブジェクト指向は、ちゃんとした設計で作れば管理しやすく再利用性も高い技術です。
逆に言えば、設計に手を抜くとかえって扱いづらく再利用性のない無駄なコードにもなります。
そういう意味で実践で敬遠されてるのかもしれないですね。
何にしても、奥が深い技術なのでまだまだ勉強中です。

自分は最初の言語がVB6.0とJavaでした(VB6.0は業務で、Javaは個人的に)
なので、最初の言語がオブジェクト指向かどうかは微妙な所です。
(VB6.0はオブジェクト指向言語だと思ってないので)

で、オブジェクト指向の理解については、
2.そこでつまずいた
ですね。
本に書いてある内容は別に難しくも何ともないのですが、
それが何で便利なのか?構造化プログラムとどう違うか?がよく分からなかった。
(完全に独学だったのもありますが)
これを乗り越えなくてはオブジェクト指向を理解する意味ないですか...続きを読む

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

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

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

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

Aベストアンサー

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

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


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング