Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli używasz słowa kluczowego new jako modyfikatora deklaracji, jawnie ukrywasz składową dostarczaną przez klasę bazową. Po ukryciu dziedziczonego elementu członkowskiego wersja pochodna elementu członkowskiego zastępuje wersję klasy bazowej. Element członkowski można ukryć, gdy wersja klasy bazowej jest widoczna w klasie pochodnej. Wersja klasy bazowej nie jest widoczna, jeśli jest 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.
Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.
Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.
Wskazówka
Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.
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 . 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 przez 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ą jednak pewne 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 deklarujeNsię jako metodę, nowe pole nie ukrywa deklaracji podstawowej w składni wywołania. Aby uzyskać więcej informacji, zobacz sekcję Odnośnik składowyspecyfikacji języka C#.Metoda wprowadzana w klasie lub strukturę 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#.