Поделиться через


новый модификатор (справочник по C#)

При использовании в качестве модификатора new объявления ключевое слово явно скрывает элемент, унаследованный от базового класса. При скрытии унаследованного члена производная версия элемента заменяет версию базового класса. В этом случае предполагается, что версия базового класса элемента видна, так как она уже будет скрыта, если она была помечена как private или, в некоторых случаях. internal Хотя вы можете скрыть или protected элементы public без использования 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 не затрагивается, так как оно не скрывается аналогичным именем.

Имя, скрываемое через наследование, принимает одну из следующих форм:

  • Как правило, константа, поле, свойство или тип, появившиеся в классе или структуре, скрывает все члены базового класса, которые совместно используют его имя. Существуют особые случаи. Например, если объявить новое поле с именем N для типа, который не является неизменяемым, и базовый тип объявляется методом, новое поле не скрывает синтаксис вызова базового объявления N . Дополнительные сведения см. в разделе поиска участниковспецификации языка C#.

  • Метод, представленный в классе или структуре, скрывает свойства, поля и типы, которые совместно используют это имя в базовом классе. Он также скрывает все методы базового класса, имеющие одинаковую сигнатуру.

  • Индексатор, представленный в классе или структуре, скрывает все индексаторы базового класса, имеющие одинаковую сигнатуру.

Это ошибка для использования обоих new элементов и переопределения на одном и том же элементе, так как два модификатора имеют взаимоисключающие значения. Модификатор new создает новый элемент с тем же именем и приводит к скрытию исходного элемента. Модификатор override расширяет реализацию для унаследованного элемента.

new Использование модификатора в объявлении, которое не скрывает унаследованный элемент, создает предупреждение.

Примеры

В этом примере базовый класс и производный класс BaseCDerivedCиспользуют то же имя 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'.

Спецификация языка C#

Дополнительные сведения см. в разделе "Новый модификатор " спецификации языка C#.

См. также