Sdílet prostřednictvím


nový modifikátor (Referenční dokumentace jazyka C#)

Pokud se používá jako modifikátor deklarace, new klíčové slovo explicitně skryje člen, který je zděděný ze základní třídy. Když skryjete zděděný člen, odvozená verze člena nahradí verzi základní třídy. Předpokládá se, že verze základní třídy členu je viditelná, protože by již byla skrytá, pokud by byla označena jako private nebo v některých případech internal. I když můžete skrýt public nebo protected členy bez použití modifikátoru new , zobrazí se upozornění kompilátoru. Pokud použijete new k explicitní skrytí člena, potlačí toto upozornění.

Klíčové slovo můžete použít new také k vytvoření instance typu nebo jako omezení obecného typu.

Chcete-li skrýt zděděný člen, deklarujte jej v odvozené třídě pomocí stejného názvu členu a upravte ho klíčovým slovem new . Příklad:

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

V tomto příkladu BaseC.Invoke je skrytý pomocí DerivedC.Invoke. Toto pole x není ovlivněno, protože není skryto podobným názvem.

Skrytí názvu prostřednictvím dědičnosti má jednu z následujících forem:

  • Obecně platí, že konstanta, pole, vlastnost nebo typ zavedený ve třídě nebo struktuře skryje všechny členy základní třídy, které sdílejí jeho název. Existují zvláštní případy. Pokud například deklarujete nové pole s názvem N tak, aby mělo typ, který není vyvolán, a základní typ deklaruje N , že se jedná o metodu, nové pole neskryje základní deklaraci invocation syntaxe. Další informace najdete v části Vyhledávání členů specifikace jazyka C#.

  • Metoda zavedená ve třídě nebo struktuře skryje vlastnosti, pole a typy, které sdílejí tento název v základní třídě. Také skryje všechny metody základní třídy, které mají stejný podpis.

  • Indexer zavedený ve třídě nebo struktuře skryje všechny indexery základní třídy, které mají stejný podpis.

Jedná se o chybu použití obou new modifikátorů a přepsání u stejného členu, protože dva modifikátory mají vzájemně se vylučující významy. new Modifikátor vytvoří nový člen se stejným názvem a způsobí skrytí původního člena. override Modifikátor rozšiřuje implementaci zděděného člena.

new Použití modifikátoru v deklaraci, která neskryje zděděný člen generuje upozornění.

Příklady

V tomto příkladu použijte základní třídu BaseCa odvozenou třídu DerivedCstejný název xpole, který skryje hodnotu zděděného pole. Příklad ukazuje použití modifikátoru new . Ukazuje také, jak přistupovat ke skrytým členům základní třídy pomocí jejich plně kvalifikovaných názvů.

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
*/

V tomto příkladu vnořená třída skryje třídu se stejným názvem v základní třídě. Příklad ukazuje, jak pomocí modifikátoru new odstranit upozornění a jak získat přístup ke skrytým členům třídy pomocí jejich plně kvalifikovaných názvů.

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
*/

Pokud modifikátor odeberete new , program se stále zkompiluje a spustí, ale zobrazí se následující upozornění:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

specifikace jazyka C#

Další informace naleznete v části Nový modifikátorspecifikace jazyka C#.

Viz také