次の方法で共有


new 修飾子 (C# リファレンス)

宣言修飾子として使用すると、 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.InvokeDerivedC.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# 言語仕様新しい修飾子セクションを参照してください。

こちらも参照ください