第41章 プロパティやインデクサの隠蔽


クラスの継承に際して、フィールドやメソッドと同様に、プロパティやインデクサもnew修飾子で隠蔽できます。



では、簡単なサンプルを見てみましょう。

// hideprop01.cs

using System;

class MyClass1
{
    int x;
    int[] arr = new int[3];

    public int setx
    {
        get
        {
            Console.WriteLine("MyClass1です。xの値を返します。");
            return x;
        }
        set
        {
            Console.WriteLine("MyClass1です。xに値を代入します。");
            x = value;
        }
    }
    public int this[int index]
    {
        get
        {
            Console.WriteLine("MyClass1です。arr[{0}]の値を返します。",
                index);
            return arr[index];
        }
        set
        {
            Console.WriteLine("MyClass1です。arr[{0}]に値を代入します。",
                index);
            arr[index] = value;
        }
    }
}

class MyClass2 : MyClass1
{
    int x;
    int[] arr = new int[3];

    new public int setx
    {
        get
        {
            Console.WriteLine("MyClass2です。xの値を返します。");
            return x;
        }
        set
        {
            Console.WriteLine("MyClass2です。xに値を代入します。");
            x = value;
        }
    }

    new public int this[int index]
    {
        get
        {
            Console.WriteLine("MyClass2です。arr[{0}]の値を返します。",
                index);
            return arr[index];
        }
        set
        {
            Console.WriteLine("MyClass2です。arr[{0}]の値に代入します。",
                index);
            arr[index] = value;
        }
    }
}

class hideprop01
{
    public static void Main()
    {
        MyClass2 mc2 = new MyClass2();

        mc2.setx = 10;

        for (int i = 0; i < 3; i++)
            mc2[i] = i * 10;

        MyClass1 mc1;
        mc1 = mc2;

        mc1.setx = 20;
        for (int i = 0; i < 3; i++)
            mc1[i] = i * 2;

        Console.WriteLine("mc2.setx = {0}", mc2.setx);
        Console.WriteLine("mc1.setx = {0}", mc1.setx);

        for (int i = 0; i < 3; i++)
            Console.WriteLine("mc2[{0}] = {1}", i, mc2[i]);
        for (int i = 0; i < 3; i++)
            Console.WriteLine("mc1[{0}] = {1}", i, mc1[i]);
            
    }
}

ちょっと長めですが、どうということもないですね。

MyClass2クラスは、MyClass1クラスから派生したクラスです。このクラスの プロパティとインデクサにはnew修飾子がついており、基本クラスのプロパティと インデクサを隠蔽しています。

Mainメソッドでは、MyClass2のインスタンスを生成して、プロパティを通じて フィールドxに値を代入しています。インデクサにも値を代入しています。

次に、MyClass2インスタンスの参照をMyClass1の参照変数に代入し、やはり値を代入しています。

次に値を読み出しています。プログラムと、次の実行結果を注意深く照らし合わせてみてください。




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

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