новый модификатор в C # - PullRequest
       20

новый модификатор в C #

1 голос
/ 17 декабря 2009

MSDN говорит:

При использовании в качестве модификатора новый Ключевое слово явно скрывает член наследуется от базового класса. Когда ты скрыть унаследованный член, производный версия участника заменяет версия базового класса. Хотя вы можете скрывать участников без использования новый модификатор, результатом является предупреждение. Если вы используете новый, чтобы явно скрыть член, это подавляет это предупреждение и документирует тот факт, что производное Версия предназначена для замены.

Пример:

class Base
{
 int value;

 virtual bool Foo()
 {
   value++;
 }
}

class Derived : Base
{
 int value;

 override bool Foo()
 {
  value++;
 }

}

Нужно ли добавлять модификатор new в объявление Derived.value? Что меняется?

Ответы [ 4 ]

14 голосов
/ 17 декабря 2009

Поскольку поле value равно private, оно не доступно в производном классе. Таким образом, объявление в производном классе на самом деле ничего не скрывает. Вы не должны добавлять new к объявлению. В противном случае ничего не изменится, за исключением того, что компилятор предупредит вас о неправильном использовании new. Если поле value было доступно в производном классе (например, оно было public), то вы должны были использовать new, чтобы выразить свое намерение скрыть базовый член:

class A {
    public int field;
}
class B : A {
    public int field; // warning. `B.field` hides `A.field`. 
}

Использование new отключит это предупреждение (оно не будет иметь никакого другого эффекта):

class B : A {
    public new int field; // Dear compiler, shut up please.
}

Вы не можете объявить метод как override и new. Они взаимоисключающие.

2 голосов
/ 17 декабря 2009

В вашем примере Derived.value не «скрывает» Base.value. Модификатор доступа по умолчанию для C # - Private. Если вы сделаете Base.value Public, то да, использование нового модификатора удалит предупреждение.

1 голос
/ 17 декабря 2009

Новый модификатор в основном используется для сокрытия не виртуальных методов. В отличие от модификатора override, он используется для сокрытия всех членов класса, а не только методов (то есть переменных и свойств).

Основная цель наступает, когда вы используете его, чтобы скрыть метод вместо использования переопределения (кстати, чтобы скрыть метод, вы не можете использовать как переопределение, так и новый. Это дает вам ошибку, а не просто исчезновение).

Использование виртуальных модификаторов и модификаторов переопределения всегда будет аналогично использованию нового модификатора, за исключением того, что при использовании виртуального и переопределения вы не можете вызывать базовый класс, кроме как из самого класса Child

0 голосов
/ 17 декабря 2009

Нет, не надо, потому что в этом случае базовый метод помечается как virtual, и, следовательно, предполагается, что базовые классы переопределяют этот метод.

Случай, когда вам может понадобиться использовать модификатор new, это если базовый метод не помечен как virtual, например:

class Base
{
    int value;

    public void Foo()
    {
        value++;
    }
}

class Derived : Base
{
    int value;

    new public void Foo()
    {
        value--;
    }
}

Также в приведенном выше примере мы должны предположить, что базовый метод Foo помечен как public или protected, так как в противном случае использование модификатора virtual в любом случае бессмысленно, так как он выиграл быть видимым для базовых / других классов.

...