new 修飾子 (C# リファレンス)
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'.
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
参照
関連項目
Override キーワードと New キーワードによるバージョン管理 (C# プログラミング ガイド)
Override キーワードと New キーワードを使用する場合について (C# プログラミング ガイド)