クラスの継承に際して、フィールドやメソッドと同様に、プロパティやインデクサも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の参照変数に代入し、やはり値を代入しています。
次に値を読み出しています。プログラムと、次の実行結果を注意深く照らし合わせてみてください。
Update 16/Sep/2006 By Y.Kumei