第38章 クラスの継承と参照


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



クラス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ができることしかできない。

と、いうことをいろいろ試してみてください。




[C# Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 13/Sep/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。