宣言修飾子として使用すると、 new
キーワードは基底クラスから継承されたメンバーを明示的に非表示にします。 継承されたメンバーを非表示にすると、メンバーの派生バージョンが基底クラスのバージョンに置き換えられます。 これは、メンバーが private
としてマークされている場合や、場合によっては internal
としてマークされている場合は既に非表示になっているため、基底クラスのバージョンのメンバーが表示されることを前提としています。
new
修飾子を使用せずにpublic
またはprotected
メンバーを非表示にすることはできますが、コンパイラ警告が表示されます。
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# 言語仕様のメンバー参照セクションを参照してください。クラスまたは構造体で導入されたメソッドは、基底クラスでその名前を共有するプロパティ、フィールド、および型を非表示にします。 また、同じシグネチャを持つすべての基底クラス メソッドも非表示になります。
クラスまたは構造体で導入されたインデクサーは、同じシグネチャを持つすべての基底クラス インデクサーを非表示にします。
2 つの修飾子には相互に排他的な意味があるため、同じメンバーに対して new
と オーバーライド の両方を使用するとエラーになります。
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# 言語仕様の新しい修飾子セクションを参照してください。
こちらも参照ください
.NET