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.
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:
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.
C#
publicclassBaseC
{
publicstaticint x = 55;
publicstaticint y = 22;
}
publicclassDerivedC : BaseC
{
// Hide field 'x'.newpublicstaticint x = 100;
staticvoidMain()
{
// 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.
C#
publicclassBaseC
{
publicclassNestedC
{
publicint x = 200;
publicint y;
}
}
publicclassDerivedC : BaseC
{
// Nested type hiding the base type members.newpublicclassNestedC
{
publicint x = 100;
publicint y;
publicint z;
}
staticvoidMain()
{
// 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:
text
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię:
Dołącz do serii meetup, aby tworzyć skalowalne rozwiązania sztucznej inteligencji oparte na rzeczywistych przypadkach użycia z innymi deweloperami i ekspertami.