tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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" が出力される。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。