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


Модификатор new (Справочник по C#)

При использовании в качестве модификатора ключевое слово 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'.

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

Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Ключевые слова C#

Ключевые слова операторов (Справочник по C#)

Модификаторы (Справочник по C#)

Практическое руководство. Управление версиями с помощью ключевых слов "Override" и "New" (Руководство по программированию в C#)

Использование ключевых слов "Override" и "New" (Руководство по программированию в C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#