では、簡単なサンプルを見てみましょう。
// 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の参照変数に代入し、やはり値を代入しています。
次に値を読み出しています。プログラムと、次の実行結果を注意深く照らし合わせてみてください。
Update 16/Sep/2006 By Y.Kumei