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 フィールドは、似た名前によって隠ぺいされないため、影響を受けません。
継承による名前の隠ぺいは、次のいずれかの形式で行われます。
一般的に、定数、フィールド、プロパティ、型をクラスまたは構造体で使用すると、同じ名前を共有するすべての基底クラス メンバーが隠ぺいされます。次のような特殊な状況があります。たとえば、呼び出し可能ではない型を持つ N という名前の新しいフィールドを宣言し、基本型が N をメソッドとして宣言する場合は、新しいフィールドが呼び出し構文内で基本型の宣言を隠ぺいすることはありません。詳細については、「C# の言語仕様」を参照してください (「式」セクション内の「メンバー」)。
メソッドをクラスまたは構造体で使用すると、基底クラスで同じ名前を共有するプロパティ、フィールド、型が隠ぺいされます。 また、同じシグネチャを持つすべての基底クラス メソッドも隠ぺいされます。
インデクサーをクラスまたは構造体で使用すると、同じシグネチャを持つすべての基底クラス インデクサーが隠ぺいされます。
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# プログラミング ガイド)