让我们说这个抽象类:
abstract public class MyBase {
abstract public int GetValue();
<some concrete methods here>
}
现在,我想将其继承为另一个抽象类,实现GetValue()
但添加新的抽象方法:
abstract public class MyBase2 : MyBase {
abstract public int GetValue2();
public override int GetValue() {
// some code here
return something;
}
}
为什么必须为override
指定MyBase2.GetValue()
? MyBase.GetValue()
是否已被标记为abstract
,因此自然会被MyBase
继承的任何东西覆盖?
答案 0 :(得分:4)
为什么必须为MyBase2.GetValue()指定重写?
这是c ++也已采用的范例。
这个想法是:通过明确地需要为override
和virtual
使用关键字abstract
,可以确保进行覆盖时不会打错字。因为如果您会发现这样的错字,那么行为,尤其是virtual
上的行为将会发生很大变化。
话虽如此;我仍然感到奇怪的是,添加方法的new
关键字仍然是可选的,并且仅在省略时才会发出警告。
答案 1 :(得分:1)
由于您的MyBase2
也被标记为abstract
,因此应告知编译器该类是GetValue()
的实现,而不是层次结构更高的其他类(实现{{1 }})