クラスを継承するといろいろな疑問がわいてきます。また、予想外の性質があったりします。その一つに、「派生クラスの参照は、基本クラスの参照変数に代入可能」というのがあります。
クラス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