Этот модификатор используется при объявлении класса-наследника в том случае, если надо явным образом скрыть факт наследования объявляемого члена класса.
public class MyBaseC
{
public int x;
public void Invoke();
}
Объявление члена класса Invoke в наследуемом классе скрывает метод Invoke в базовом классе:
public class MyDerivedC : MyBaseC
{
new public void Invoke();
}
А вот данное-член x не было скрыто в производном классе соответствующим членом, следовательно, остаётся доступным в производном классе.
Сокрытие имени члена базового класса в производном классе возможно в одной из следующих форм:
Константа, поле, свойство, или внедрённый в класс тип или структура скрывают ВСЕ одноименные члены базового класса.
Внедрённый в класс или структуру метод скрывает в базовом классе свойства, поля, типы, обозначенные тем же самым идентификатором. Также в базовом классе скрываются одноимённые методы с той же самой сигнатурой.
Объявляемые в производном классе индексаторы, скрывают одноименные индексаторы в базовом классе с аналогичной сигнатурой.
В производном классе одновременное использование члена базового класса и его переопределённого потомка является ошибкой.
Полное квалифицированное имя. Примеры использования
В этом примере базовый и BC и производный DC классы используют одно и то же имя для обозначения объявляемого в обоих классах члена типа int. new модификатор подчеркивает факт недоступности члена x базового класса в производном классе. Однако из производного класса всё-таки можно обратиться к переопределённому полю базового класса с использованием полного квалифицированного имени.
using System;
public class BC
{
public static int x = 55;
public static int y = 22;
}
public class DC : BC
{
new public static int x = 100; // Переопределили члена базового класса
public static void Main()
{
// Доступ к переопределённому члену x:
Console.WriteLine(x);
// Доступ к члену базового класса x:
Console.WriteLine(BC.x);
// Доступ к члену y:
Console.WriteLine(y);
}
}
В производном классе DC переопределяется вложенный класс C. В рамках производного класса легко можно создать объект-представитель вложенного переопределённого класса C. Для создания аналогичного объекта-представителя базового класса, необходимо использовать полное квалифицированное имя.
using System;
public class BC
{
public class C
{
public int x = 200;
public int y;
}
}
public class DC:BC
{
new public class C // Вложенный класс базового класса скрывается
{
public int x = 100;
public int y;
public int z;
}
public static void Main()
{
// Из производного класса виден переопределённый вложенный класс:
C s1 = new C();
// Полное имя используется для доступа к вложенному в базовый класс: