Модификатор new (Справочник по C#)
Обновлен: Ноябрь 2007
При использовании в качестве модификатора ключевое слово new явно скрывает члены, унаследованные от базового класса. При скрытии унаследованного члена его производная версия заменяет версию базового класса. Несмотря на то, что члены можно скрыть и без модификатора new, в результате возникнет предупреждение. Если new используется для явного скрытия члена, модификатор отключает вывод предупреждение и документирует тот факт, что производная версия предназначена для замены.
Чтобы скрыть унаследованный член, объявите его в производном классе с помощью такого же имени и измените с помощью модификатора new. Пример.
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
В этом примере BaseC.Invoke скрывается с помощью DerivedC.Invoke. Поле x не затрагивается, поскольку оно не скрыто похожим именем
Скрытие имени через наследование принимает одну из следующих форм.
Константа, поле, свойство или тип, представленные в классе или структуре, скрывают всех членов базового класса с одним именем.
Метод, представленный в классе или структуре, скрывает в базовом классе свойства, поля и типы с одним именем. Он также скрывает все методы базовых классов, имеющие одинаковую подпись.
Индексатор, представленный в классе или структуре, скрывает все индексаторы базового класса, имеющие одинаковую подпись.
Совместное использование модификатора new и модификатора переопределения в одном члене является недопустимым, поскольку два модификатора имеют взаимоисключающие значения. Модификатор new создает новый элемент с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена.
При использовании модификатора new в объявлении, которое не скрывает наследуемого члена, возникает предупреждение.
Пример
В этом примере базовый класс BaseC и производный класс DerivedC используют одно и то же имя поля x, которое скрывает значение унаследованного поля. В примере показано использование модификатора new. Здесь также показан доступ к скрытым членам базового класса с помощью их полных имен.
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
*/
В этом примере вложенный класс скрывает класс, имеющий такое же имя в базовом классе. Здесь показано использование модификатора new для исключения предупреждающего сообщения, а также получение доступа к членам скрытого класса с помощью их полных имен.
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
*/
При удалении модификатора new программа продолжит компиляцию и выполнение, однако будет выведено следующее предупреждение.
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
Модификатор new можно использовать и для изменения вложенного типа, если этот тип скрывает другой тип, как показано в следующем примере.
Спецификация языка C#
Дополнительные сведения см. в следующем разделе документа Спецификация языка C#:
- 10.3.4 Модификатор new
См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Ключевые слова операторов (справочник по C#)
Модификаторы (Справочник по C#)