タイトル : Re^3: [解決] クラスの記述法 投稿日 : 2007/09/07(Fri) 16:16 投稿者 : 魔界の仮面弁士
No.6251 の例で言えば、 (1) MsgBox(New Poodle().Test()) +-------------------------- | Me:プードルクラス | MyBase:動物クラス | MyClass:犬クラス +-------------------------- (2) MsgBox(New Dog().Test()) +-------------------------- | Me:犬クラス | MyBase:動物クラス | MyClass:犬クラス +-------------------------- となりますが、(2) で Me と MyClass が同じ結果を返すからといって、 Me が MyClass として扱われたというわけではありません。 Me.ToString() の動作は、 New されたインスタンスが Dog だったら、「犬クラス」 New されたインスタンスが Poodle なら、「プードルクラス」 となるだけです。 一方、MyClass.ToString() の動作は、いずれも Test メソッドは Dog クラスにだけ実装されているので、「犬クラス」 を返すことになります。 =========================================================================== > こんな検証用プログラムを作りました。 > Dim Album As New AlbumDef > Album.Test() 「Dim Album As New AlbumDef」とはすなわち、 「Dim Album As AlbumDef = New AlbumDef()」の省略表記ですよね。 まずは、 インスタンス(New で生成されたオブジェクトのこと)の型は、AlbumDef 型である。 Album 変数の型もまた、AlbumDef 型である。 Album.Test() によって、「AlubumDef クラスに実装されている Test メソッド」が実行される。 という 3 つの点を抑えておいてください。 > そのまま実行すれば、 > MyCLASS > MyBase > MyCLASS > でしたので「MeはMyClassになった」。 AlubumDef の Test メソッド内で行われている事を追跡してみましょう。 > MyClass.Modified() → このクラス(AlbumDef クラス)に実装されている Modified メソッドを実行せよ。 →→ "MyCLASS" が出力される。 > MyBase.Modified() → 継承元クラス(BaseDef クラス)に実装されている Modified メソッドを実行せよ。 →→ "MyBase" が出力される。 > Me.Modified() → 現在のインスタンスに実装されている Modified メソッドを実行せよ。 →→ Album 変数に代入されているインスタンスは、AlbumDef 型。 →→→ "MyBase" が出力される。 =========================================================================== > AlbumDefの方のModifiedメソッドをコメントアウトして実行すると > MyBase <----(これは納得行かないけど。だってMyClassでは定義していないもの) > MyBase > MyBase > でしたので「MeはMyBaseになった」。 この場合、AlbumDef では Modified メソッドが再定義(シャドウ または オーバーライド)されて いないため、結果的に BaseDef の Modified メソッドが呼び出されることになります。 # 面倒なので、[シャドウとオーバーライドの違い] は、ここでは触れません。下記参照。 # http://msdn2.microsoft.com/ja-jp/library/ms172785%28VS.80%29.aspx > MyClass.Modified() → このクラス(AlbumDef クラス)に実装されている Modified メソッドを実行せよ。 →→ AlbumDef では Modified が再定義されていない。BaseDef.Modified が実行される。 →→→ "MyBase" が出力される。 > MyBase.Modified() → 継承元クラス(BaseDef クラス)に実装されている Modified メソッドを実行せよ。 →→ "MyBase" が出力される。 > Me.Modified() → 現在のインスタンスに実装されている Modified メソッドを実行せよ。 →→ Album 変数に代入されているインスタンスは、AlbumDef 型。 →→→ AlbumDef では Modified が再定義されていない。BaseDef.Modified が実行される。 →→→→ "MyBase" が出力される。 |