Подтвердить что ты не робот

Что делать, если я не прислушиваюсь к предупреждению "скрывает унаследованный элемент. Чтобы текущий член переопределял эту реализацию..."

Это, возможно, тонкий момент, но это касается предупреждения о том, что компилятор задает вопрос, если вы выполните что-то вроде:

class A
{
    public virtual void F() { }
}
class B : A
{
    public void F() { }
}

Затем вы получите предупреждение:

'EomApp1.B.F()' hides inherited member 'EomApp1.A.F()'.
To make the current member override that implementation, add the override keyword. Otherwise use the new keyword.

image of error message

ВОПРОС: Какое предупреждение на самом деле предупреждает меня, произойдет, если я ничего не сделаю? Будет ли моя программа работать по-разному, если я добавлю "новое" ключевое слово против, если я этого не сделаю?

(Примечание: я знаю, что могу проверить это достаточно легко, но я подумал, что здесь стоит спросить)

4b9b3361

Ответ 1

Не будет ничего, кроме метода, который у вас есть, F() также не является полиморфным. Очень легко ошибиться в коде, если вы начали использовать ссылку на базовый класс, поэтому вы будете предупреждены. Конечно, это может быть то, что вы хотите, поэтому новое ключевое слово просто делает его более явным.

например.

B b1 = new B();
b1.F(); // will call B.F()

A b2 = new B();
b2.F(); // will call A.F()

Теперь, если вы добавите класс C с new, он будет вести себя так же, как B. Если вы добавите класс D с override, то F станет полиморфным:

class C : A
{
    public new void F() { }
}

class D : A
{
    public override void F() { }
}

// Later

C c1 = new C();
c1.F(); // will call C.F()

A c2 = new C();
c2.F(); // will call A.F()

D d1 = new D();
d1.F(); // will call D.F()

A d2 = new D();
d2.F(); // will call D.F()

Смотрите эту скрипту.

Ответ 2

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

Если вы действительно хотите полностью отдельный метод, и если у вас есть возможность использовать другое имя, я бы взял такой подход. Наличие одного метода, скрывающего другой, обычно значительно снижает читаемость ИМО. Это не так уж плохо, если целью является просто дать более конкретный тип возвращаемого значения (и вы убедитесь, что более слабо типизированный метод возвращает одно и то же значение), но это довольно редкий случай.

Ответ 4

Это просто предупреждение. Код будет работать. В некоторых случаях это предупреждение может привести к некоторой проблеме.

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

class A
{
    public virtual void F() { }
}
class B : A
{
   new public void F() { }
}

Ссылка

https://msdn.microsoft.com/en-us/library/435f1dw2.aspx

https://msdn.microsoft.com/en-us/library/aa691135(v=vs.71).aspx