Udostępnij za pośrednictwem


nowy modyfikator (odwołanie w C#)

Gdy jest używany jako modyfikator deklaracji, new słowo kluczowe jawnie ukrywa element członkowski dziedziczony z klasy bazowej. Po ukryciu dziedziczonego elementu członkowskiego wersja pochodna elementu członkowskiego zastępuje wersję klasy bazowej. Przyjęto założenie, że wersja klasy bazowej elementu członkowskiego jest widoczna, ponieważ jest już ukryta, jeśli została ona oznaczona jako private lub, w niektórych przypadkach, internal. Mimo że można ukryć public lub protected elementy członkowskie bez używania new modyfikatora, zostanie wyświetlone ostrzeżenie kompilatora. Jeśli używasz new polecenia , aby jawnie ukryć element członkowski, pomija to ostrzeżenie.

Możesz również użyć new słowa kluczowego, aby utworzyć wystąpienie typu lub jako ograniczenie typu ogólnego.

Aby ukryć dziedziczony element członkowski, zadeklaruj go w klasie pochodnej przy użyciu tej samej nazwy składowej i zmodyfikuj ją za pomocą słowa kluczowego new . Na przykład:

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

W tym przykładzie BaseC.Invoke wartość jest ukryta za pomocą polecenia DerivedC.Invoke. Nie ma to wpływu na pole x , ponieważ nie jest ono ukryte pod podobną nazwą.

Ukrywanie nazwy przez dziedziczenie przyjmuje jedną z następujących form:

  • Ogólnie rzecz biorąc, stała, pole, właściwość lub typ wprowadzony w klasie lub strukturę ukrywa wszystkie składowe klasy bazowej, które mają swoją nazwę. Istnieją specjalne przypadki. Jeśli na przykład zadeklarujesz nowe pole o nazwie N , aby mieć typ, który nie jest wywoływany, a typ podstawowy deklaruje N , że jest metodą, nowe pole nie ukrywa deklaracji podstawowej w składni wywołania. Aby uzyskać więcej informacji, zobacz sekcję Odnośnik składowy specyfikacji języka C#.

  • Metoda wprowadzona w klasie lub struct ukrywa właściwości, pola i typy, które współużytkujące tę nazwę w klasie bazowej. Ukrywa również wszystkie metody klasy bazowej, które mają ten sam podpis.

  • Indeksator wprowadzony w klasie lub strukturę ukrywa wszystkie indeksatory klas bazowych, które mają ten sam podpis.

Jest to błąd podczas używania obu elementów new i zastąpienia w tym samym elemencie członkowskim, ponieważ oba modyfikatory mają wzajemnie wykluczające się znaczenie. Modyfikator new tworzy nowy element członkowski o tej samej nazwie i powoduje ukrycie oryginalnego elementu członkowskiego. Modyfikator override rozszerza implementację dziedziczonego elementu członkowskiego.

new Użycie modyfikatora w deklaracji, która nie ukrywa dziedziczonego elementu członkowskiego generuje ostrzeżenie.

Przykłady

W tym przykładzie klasa bazowa, BaseCi klasa DerivedCpochodna , użyj tej samej nazwy xpola , która ukrywa wartość dziedziczonego pola. W przykładzie pokazano użycie new modyfikatora. Pokazuje również, jak uzyskać dostęp do ukrytych elementów członkowskich klasy bazowej przy użyciu ich w pełni kwalifikowanych nazw.

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

W tym przykładzie zagnieżdżona klasa ukrywa klasę o tej samej nazwie w klasie bazowej. W tym przykładzie pokazano, jak używać new modyfikatora w celu wyeliminowania komunikatu ostrzegawczego i sposobu uzyskiwania dostępu do ukrytych składowych klasy przy użyciu w pełni kwalifikowanych nazw.

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

Jeśli usuniesz new modyfikator, program będzie nadal kompilowany i uruchamiany, ale zostanie wyświetlone następujące ostrzeżenie:

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

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję dotyczącą nowej modyfikatoraspecyfikacji języka C#.

Zobacz też