アプリ版:「スタンプのみでお礼する」機能のリリースについて

コンストラクタは、起動時に自動生成される処理のことをいいますか?
1度だけ実行されるクラスをコンストラクタと言っているのですか???

デリゲートは、クラスからメソッドを呼び出すことをデリゲートといいますか?
クラスから処理を別に渡すとそれはデリゲートですか???

A 回答 (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値]
という出力が得られます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

コンストラクタは理解できました。

>メソッドのオーバーライドは引数が異なる必要があるが、
オーバーライドではなく、オーバーロードでした。
オーバーロードは同じメソッド名で引数・戻り値が違うため動作が動的に変えられるので大変重宝しそうです。

その点、オーバーライド・デリゲートはメソッド自体の機能を変えてしまいます。
なら、最初からその機能を持ったメソッドを作ってしまえばいいじゃないかと考えてしまうわけです。

オーバーライド・デリゲートは理解するのが難しいです。
使いどころがわからないので、使う機会がなく、理解が一向に進みません。

もうちょっと本を何往復かして考えます。

大変ありがとうございましたmm

お礼日時:2009/06/01 02:15

クラスのインスタンスを作成した時に呼び出されるのが「コンストラクタ」です。


例えば・・・
Dim clsA As ClassA ← ここはclsAを宣言しただけ。
clsA = New ClassA ← ここでインスタンスが作成され、ClassAのコンストラクタが呼び出される。

Dim clsA As New ClassA
とすると、clsAの宣言と同時にインスタンスが作成され、コンストラクタが呼び出されます。


デリゲートは、Cで言うところの関数ポインタの役割を果たします。
クラスからメソッドを呼び出すことは、単に「メソッドの呼び出し」と言うかと・・・。
デリゲートについては検索すれば解説&サンプルがあるのでそちらをご覧になるとよいと思います。

参考URL:http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbne …
    • good
    • 0
この回答へのお礼

ありがとうございます。

1.コンストラクタについて
インスタンスを生成したら、コンストラクタが自動的に呼び出される。
しかし、この回答ではコンストラクタを記述していないので何もされずにインスタンスが生成される。
こういう解釈でいいですか?

2.デリゲートについて
メソッドのオーバーライドは引数が異なる必要があるが、デリゲートは、引数が同じ必要がある。
そしてオーバーライド・デリゲートが異なる処理を実行することができる。
という解釈でいいですか?


解釈を間違えていたら指摘してくださいmm

お礼日時:2009/05/31 15:20

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