2010-10-28 4 views
2

Я хочу знать, не вставил ли я ключевое слово override перед методом в методе производного класса m1(), то каково значение по умолчанию перед этим, или это вызовет ошибку времени компиляции?C# переопределить ключевое слово

class A { virtual void m1(){} } 
class B: A { void m1(){} } 
+3

Когда вы скомпилировали этот код, что вышло в Visual Studio? –

ответ

8

Во-первых, вы получите ошибку компиляции, потому что virtual члены не могут быть частными, которые A.m1 как написано.

Во-вторых, как только вы исправите это, вы получите предупреждение о компиляции, которое B.m1 скрывает унаследованного пользователя A.m1.

В-третьих, если вы делаете что-то вроде этого:

A a = new B(); 
a.m1(); 

Это будет вызывать A.m1 а если вставить override в определение B.m1 то выше будет вызывать B.m1. Однако, если вы введете new в определение B.m1, то указанное выше будет по-прежнему вызывать A.m1, но оно будет опускать предупреждение о компиляции.

+0

он будет скрывать, что метод базового класса не будет наследоваться для производного класса. Если я использую новое kew, тогда его можно скрыть метод базового класса. и если да, то в чем разница между использованием ключевого слова KEY и не использованием ключевого слова KEY – NoviceToDotNet

+0

Под «KEY» вы имели в виду «новый»? Разница в том, что он избавится от предупреждения времени компиляции. Предупреждение должно сказать вам: «Эй, вы хотели переопределить или скрыть унаследованного участника? Я собираюсь предположить, что вы хотели спрятаться, но вы должны изучить это». «Новый» должен сказать компилятору, «да, я хотел скрыть унаследованный элемент». Так что да, поведение такое же, но предупреждение служит реальной цели. C# бережно держит вас от стрельбы в ногу. – jason

+1

Если вы хотите скрыть его, используйте «новое», чтобы указать, что вы действительно хотите скрыть и не переопределить его. Единственное, что новое делает, это подавление предупреждения компилятора. – CodesInChaos

1

Когда вы скомпилируете его, вы получите предупреждение о том, что B.m1() скрывает унаследованный член A.m1().

Вы должны использовать новое ключевое слово, если хотите разбить цепочку наследования или использовать переопределение для получения своего виртуального поведения.

2

Без override компилятор выдает предупреждение, насколько я помню. В этом случае метод обрабатывается так, как если бы он имел модификатор new.

Смежные вопросы