new 修飾子 (C# リファレンス)
更新 : 2007 年 11 月
new キーワードを修飾子として使用すると、基本クラスから継承されたメンバを明示的に隠ぺいできます。継承されたメンバを隠ぺいすると、派生バージョンのメンバで基本クラスのバージョンが置き換えられます。new 修飾子を使わずにメンバを隠ぺいすることもできますが、警告が表示されます。new を使用してメンバを明示的に隠ぺいすると、この警告が抑制され、派生バージョンによる置換が意図した動作であることを示す記録にもなります。
継承されたメンバを隠ぺいするには、派生クラスで同じ名前を使用してメンバを宣言し、new 修飾子で修飾します。次に例を示します。
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
この例では、BaseC.Invoke は DerivedC.Invoke で隠ぺいされます。x フィールドは、似た名前によって隠ぺいされないため、影響を受けません。
継承による名前の隠ぺいは、次のいずれかの形式で行われます。
定数、フィールド、プロパティ、型をクラスまたは構造体で使用すると、同じ名前を持つすべての基本クラス メンバが隠ぺいされます。
メソッドをクラスまたは構造体で使用すると、基本クラスで同じ名前を持つプロパティ、フィールド、型が隠ぺいされます。また、同じシグネチャを持つすべての基本クラス メソッドも隠ぺいされます。
インデクサをクラスまたは構造体で使用すると、同じシグネチャを持つすべての基本クラス インデクサが隠ぺいされます。
new と override には相反する意味があるため、同じメンバにこの 2 つの修飾子を使用するとエラーになります。new 修飾子は、同じ名前で新しいメンバを作成し、元のメンバを隠ぺいします。override 修飾子は、継承されたメンバの実装を拡張します。
宣言で、継承されたメンバを隠ぺいしない new 修飾子を使用すると、警告が出力されます。
使用例
この例では、基本クラス BaseC と派生クラス DerivedC が同じフィールド名 x を使用するため、継承されるフィールドの値が隠ぺいされます。この例では、new 修飾子の使い方を示します。また、基本クラスの隠ぺいされたメンバに完全修飾名を使ってアクセスする方法も示します。
public class BaseC
{
public static int x = 55;
public static int y = 22;
}
public class DerivedC : BaseC
{
// Hide field 'x'.
new public static int x = 100;
static void Main()
{
// Display the new value of x:
Console.WriteLine(x);
// Display the hidden value of x:
Console.WriteLine(BaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}
/*
Output:
100
55
22
*/
この例では、入れ子になったクラスが、基本クラスにある同名のクラスを隠ぺいします。この例では、new 修飾子を使って警告メッセージが表示されないようにする方法に加えて、完全修飾名を使用してクラスの隠ぺいされたメンバにアクセスする方法も示します。
public class BaseC
{
public class NestedC
{
public int x = 200;
public int y;
}
}
public class DerivedC : BaseC
{
// Nested type hiding the base type members.
new public class NestedC
{
public int x = 100;
public int y;
public int z;
}
static void Main()
{
// Creating an object from the overlapping class:
NestedC c1 = new NestedC();
// Creating an object from the hidden class:
BaseC.NestedC c2 = new BaseC.NestedC();
Console.WriteLine(c1.x);
Console.WriteLine(c2.x);
}
}
/*
Output:
100
200
*/
new 修飾子を削除すると、プログラムのコンパイルおよび実行は行われますが、次の警告が出力されます。
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
また、入れ子にされた型が他の型を隠ぺいしている場合は、次の例で示されているように、入れ子にされた型を new 修飾子で修飾することもできます。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
- 10.3.4 new 修飾子