• ベストアンサー

コンストラクタとデリゲートの意味を教えてください。

コンストラクタは、起動時に自動生成される処理のことをいいますか? 1度だけ実行されるクラスをコンストラクタと言っているのですか??? デリゲートは、クラスからメソッドを呼び出すことをデリゲートといいますか? クラスから処理を別に渡すとそれはデリゲートですか???

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

  • ベストアンサー
回答No.2

> 1.コンストラクタについて > インスタンスを生成したら、コンストラクタが自動的に呼び出される。 > しかし、この回答ではコンストラクタを記述していないので何もされずにインスタンスが生成される。 > こういう解釈でいいですか? はい。大丈夫だと思います。 > 2.デリゲートについて > メソッドのオーバーライドは引数が異なる必要があるが、デリゲートは、引数が同じ必要がある。 デリゲートとオーバーロードがごっちゃになってませんか? ■オーバーライド 基底クラスのメソッドやプロパティを派生クラスで塗り替える。ゆえに、引数の数・型と、戻り値の型は同じでなければならない。 ■オーバーロード 同じ名前のメソッドやプロパティを異なる引数・戻り値を持つメソッド・プロパティとして定義する。 ■デリゲート 呼び出すメソッドやプロパティを動的に定義するための仕組み。あるメソッドを呼び出す場合、デリゲート宣言ではその引数・戻り値を一致させる必要がある。 以下に、この3つを詰め込んだコードを載せておきます。 ' 基底クラス KiteiA Public Class KiteiA  ' オーバーライド可能な関数の定義  Public Overridable Function Hoge(ByVal Value As Integer) As String   Return Value.ToString()  End Function  ' Hoge関数を呼び出すためのデリゲート宣言  ' ※引数・戻り値の型は同じでなければならない  Public Delegate Function HogeCall(ByVal Value As Integer) As String End Class ' 派生クラス HaseiA Public Class HaseiA  ' 基底クラス KiteiA を継承  Inherits KiteiA  ' 基底クラス KiteiAのHoge関数をオーバーライド  ' ※関数名・引数・戻り値の型は同じでなければならない  Public Overrides Function Hoge(ByVal Value As Integer) As String   Return Value.ToString & "[32bit値]"  End Function  ' 基底クラス KiteiAのHoge関数に対しオーバーロードを追加  ' ※引数・戻り値の型は異なっても構わない  Public Overloads Function Hoge(ByVal Value As Short) As String   Return Value.ToString & "[16bit値]"  End Function End Class ' メインクラス Public Class Main  ' ここからスタート  Public Sub Main()   ' 派生クラス HaseiA のインスタンスを作成   Dim clsA As New HaseiA   ' オーバーライドされたHogeを呼び出す   Call Console.WriteLine(clsA.Hoge(123I))   ' オーバーロードのHogeを呼び出す   Call Console.WriteLine(clsA.Hoge(123S))   ' Hogeを呼び出すためのデリゲートを定義   ' 呼び出すのは、clsAのHoge関数   Dim dgtHoge As New KiteiA.HogeCall(AddressOf clsA.Hoge)   ' デリゲートを使ってHogeを呼び出す   Call Console.WriteLine(dgtHoge.Invoke(123I))  End Sub End Class 上記を実行すると 123[32bit値] 123[16bit値] 123[32bit値] という出力が得られます。

rescue99
質問者

お礼

ありがとうございます。 コンストラクタは理解できました。 >メソッドのオーバーライドは引数が異なる必要があるが、 オーバーライドではなく、オーバーロードでした。 オーバーロードは同じメソッド名で引数・戻り値が違うため動作が動的に変えられるので大変重宝しそうです。 その点、オーバーライド・デリゲートはメソッド自体の機能を変えてしまいます。 なら、最初からその機能を持ったメソッドを作ってしまえばいいじゃないかと考えてしまうわけです。 オーバーライド・デリゲートは理解するのが難しいです。 使いどころがわからないので、使う機会がなく、理解が一向に進みません。 もうちょっと本を何往復かして考えます。 大変ありがとうございましたmm

その他の回答 (1)

回答No.1

クラスのインスタンスを作成した時に呼び出されるのが「コンストラクタ」です。 例えば・・・ Dim clsA As ClassA ← ここはclsAを宣言しただけ。 clsA = New ClassA ← ここでインスタンスが作成され、ClassAのコンストラクタが呼び出される。 Dim clsA As New ClassA とすると、clsAの宣言と同時にインスタンスが作成され、コンストラクタが呼び出されます。 デリゲートは、Cで言うところの関数ポインタの役割を果たします。 クラスからメソッドを呼び出すことは、単に「メソッドの呼び出し」と言うかと・・・。 デリゲートについては検索すれば解説&サンプルがあるのでそちらをご覧になるとよいと思います。

参考URL:
http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbnet2_11/vbnet2_11_01.html
rescue99
質問者

お礼

ありがとうございます。 1.コンストラクタについて インスタンスを生成したら、コンストラクタが自動的に呼び出される。 しかし、この回答ではコンストラクタを記述していないので何もされずにインスタンスが生成される。 こういう解釈でいいですか? 2.デリゲートについて メソッドのオーバーライドは引数が異なる必要があるが、デリゲートは、引数が同じ必要がある。 そしてオーバーライド・デリゲートが異なる処理を実行することができる。 という解釈でいいですか? 解釈を間違えていたら指摘してくださいmm

関連するQ&A

  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • 親クラスコンストラクタを呼び出すタイミングについて

    ・親クラスコンストラクタを呼び出すタイミングに決まりはあるのでしょうか? ・例えば、子クラスのコンストラクタではなくて、子クラスのメソッドとかで呼び出しても良いのでしょうか? ・後、親クラスコンストラクタ処理が不要な場合は、子クラスから呼ばなくても別に構わないのでしょうか?

    • ベストアンサー
    • PHP
  • Javaのstaticメソッドの意味を教えて下さい

    Javaのstaticメソッドの意味を教えて下さい。 現在の解釈では、staticなメソッドとはインスタンスの生成に依存せず呼び出せる処理のことだと認識しています。逆にstaticでないメソッドは、生成後のインスタンスにしか使えない処理だと理解しています。 しかし、コンストラクタがstaticでないことに気がつき、疑問が生まれました。コンストラクタはstaticではないので、コンストラクタを呼び出す時にはそのクラスのインスタンスが必要になるはずです。しかしこのインスタンスを作るのにもコンストラクタが必要です。コンストラクタを使うためにインスタンスが必要で、インスタンスを作るためにコンストラクタが必要という無限ループになってしまいました。 そこで改めて、staticメソッドの意味を教えて頂きたいです。

  • コンストラクタについて

    プログラム初心者です classを使うときに使うコンストラクタについて教えてください なぜ自動で実行できるのか不思議です 質問1 このコンストラクタの使い道を教えてください。 質問2 PHPはC言語で作られているのですよね?コンストラクタを自動で実行しているC言語の処理はどうなっているのですか? 質問3 classと関数の違いがわかりません。ネットで調べると「classだと変数を保持できる」とでますが関数だと保持できないのでしょうか? よろしくお願いします

    • ベストアンサー
    • PHP
  • コンストラクタ

    恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{    Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?

    • ベストアンサー
    • Java
  • 用語/newを伴わないコンストラクタの呼出=関数?

    コンストラクタを勉強しているのですが、「用語」「意味」が分からないので、教えてください ■質問1 ・いついかなる時でも、「コンストラクタ関数」=「コンストラクタ」=「関数」=「メソッド」なのでしょうか? ・例えば、「newをつけずに、コンストラクタを関数として呼ぶ」場合も、「コンストラクタを実行する」と言うのでしょうか? ■質問2 … 「new」付与による相違 ・「new」付与しないと、「コンストラクタ」内で「this」が指し示す対象が異なる(グローバルオブジェクトになってしまう)のだと思うのですが、それ以外に何か相違点はあるのでしょうか? ・「new」付与しないとオブジェクトが正しく生成されないので、不具合が生じる可能性がある? ■質問3 ・「new」を付けずに、オブジェクトを関数として実行するのは、例えばどういう使い方をするときなのでしょうか?

  • djUnit コンストラクタがprivateでテストが行えない

    djUnit コンストラクタがprivateでテストが行えない djUnitを使っております。 テスト対象のメソッドにアクセスしてテストを行いたいのですが、 どうもそれができません。 理由としては、コンストラクタがprivateになっているから?です。 (「コンストラクター TestManager() は不可視です」というエラーが出ます。) コンストラクタのprivateを消せば、テスト対象のメソッドにアクセスできるのですが、 実際には消してテストをしてはだめということになっています。 コンストラクタがprivateでもdjUnitでテストが行える方法がございましたら、 書き方をご教授いただけないでしょうか? どうかよろしくお願いいたします。 一応下記が詳細です。 (クラス名、コンストラクタ名、メソッド名) ------------------------ [クラス] public final class TestManager [コンストラクタ] private TestManager() { } [テスト対象のメソッド] public Structure testCreate(byte[], byte[], byte[]) ----------------------- 色々試したのですが、途中で終了してしまって 目的のテスト対象のメソッドを実行するところまで辿りつけません・・・。 [お試しパターン1] Class c = TestManager.class; Constructor[] con = c.getDeclaredConstructors(); TestManager conIns = (TestManager)con[0].newInstance(); //ここで処理が終了してしまう [お試しパターン2] Class testClass = Class.forName("TestManager"); //ここで処理が終了してしまう Constructor[] TestManager = testClass.getDeclaredConstructors(); TestManager[0].setAccessible(true); Object conIns = TestManager[0].newInstance((Object[])null); TestManager test = (TestManager)conIns;

    • ベストアンサー
    • Java
  • 【PHP】コンストラクタ―について

    コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor();

    • ベストアンサー
    • PHP
  • コピーコンストラクタが呼び出されていない?

    コピーコンストラクタが呼び出されていない? class myclass { public: int x; myclass(const int& init_); //コンストラクタ myclass(const myclass& init_); //コピーコンストラクタ const myclass operator+(const myclass& rhs); //加算 const myclass& operator=(const myclass& rhs); //代入 }; と定義したクラスを使ってオブジェクトを生成するときに妙な挙動をしています。 myclass mc1(10); myclass mc2 = 20; myclass mc3(mc1 + mc2); //コピーコンストラクタが呼ばれるはず このコードを実行した結果は、mc3(mc1+mc2)では自分で定義したコピーコンストラクタは実行されませんでした。 mc3(mc1 = mc2)と実行すれば、コピーコンストラクタが実行されたのですが、この違いはどこにあるのでしょうか。 そもそも、myclassとmyclass&は全く別のものなのでしょうか?

  • コンストラクタについて

    VCの勉強をしています。 ちょっとショッキングなことを聞いてしまいました。 クラスのインスタンスを作成した場合、 コンストラクタは継承もとのコンストラクタもよばれる?? これって本当ですか!! MFCだとクラスの階層はだいぶ深いです。 例えば基本のCviewなんかはCObject>CCmdTarget>CWnd>Cviewの順に継承されています。 MFCでは更にCViewを継承したCTestViewなんてクラスがコードの主役です。 それでCTestViewのインスタンスを作成した場合、 コンストラクタはCTestViewのコンストラクタだけ実行すると思いますが、 ショッキングな内容ではCViewのコンストラクタも実行されてます。 これって本当にそうなるのでしょうか。 もし、そうならコンストラクタはてっぺんのCObjectから順に実行されますか。 それとも1つ上の継承先だけですか。 また、何でこんな仕組みにする必要があるのですか? 更にいえばCObjectにはSerializeという関数があります。 これをCTestView.serializeとした場合、 CObjectから順々にSerializeが呼び出されているのでしょうか? そんなことあるわけないよと、あまりにもバカバカしいのですが、 知人がそうだと言い張るのでよろしくお願いします。

専門家に質問してみよう