クラスAからクラスBが派生したとします。この時クラスBのインスタンスの参照をクラスAの参照変数に代入できます。しかし、このようにすると、アクセスできるのはクラスAがアクセスできるメンバに限定されます。クラスBで新規に作成したメンバにはアクセスできません。
これは、非常に重要な性質です。
まずは、例題を見てください。
// inheritance02.cs using System; class MyClass1 { public int x = 0; } class MyClass2 : MyClass1 { public int y = 1; } class MyClass3 : MyClass2 { public int z = 2; } class inheritance02 { public static void Main() { MyClass3 mc3 = new MyClass3(); MyClass1 mc1; mc1 = mc3; Console.WriteLine("x = {0}", mc1.x); MyClass2 mc2; mc2 = mc3; //同じものを代入しているのにできることが増えている Console.WriteLine("x = {0}, y = {1}", mc2.x, mc2.y); Console.WriteLine("x = {0}, y = {1}, z = {2}", mc3.x, mc3.y, mc3.z); } }MyClass3はMyClass2から派生しています。MyClass2はMyClass1から派生しています。
MyClass1から見るとMyClass3は孫に当たります。
Mainメソッドでは、MyClass3のインスタンスのみを生成しています。この参照をMyClass1の参照変数mc1に代入しています。mc1はMyClass1がアクセスできるメンバのみにアクセス可能です。この場合、インスタンスフィールドのxのみにアクセス可能です。
次に、MyClass2の参照変数mc2にMyClass1の参照を代入しています。こうすると、MyClass2でアクセス可能なメンバx,yにアクセス可能となります。同じ参照を代入しているのに、参照変数の型によりできることが違ってきますね。
では、実行結果を見てみましょう。
MyClass1の参照変数に代入するとMyClass1ができることしかできない。
MyClass2の参照変数に代入するとMyClass2ができることしかできない。
と、いうことをいろいろ試してみてください。
Update 13/Sep/2006 By Y.Kumei