我得到了virtual/override
和new
修饰符之间的区别。但是当我没有指定任何修饰符的时候呢。
例如,我有Animal
和Cat
个类(Cat
继承Animal
)。
Animal
类有方法:
public void Say()
{
// do something
}
Cat
类有方法:
public void Say()
{
// do something else
}
当我使用这种方法时,它们就像我使用new
关键字一样工作。
Visual Studio向我显示警告(如果要隐藏,请使用新关键字)。
为什么在不指定关键字时编译器不会中断。它只是神奇地用了一点警告。我可以使用某些严格模式,也可以在IDE中编辑设置。
或者可能是我没有获得的功能:)
答案 0 :(得分:8)
为什么编译器在我没有指定关键字时不会中断。
要避免"brittle base class"问题 - Cat
最初使用Say()
方法,然后Animal
的作者也希望添加Say()
方法。使用当前的方法,不是一个重大改变 - 它将为Cat
的作者创建一个警告,但这就是全部。所有代码的行为将保持不变。然后,Cat
的作者可以决定如何处理他们的Say
方法 - 添加new
修饰符,或覆盖Animal.Say()
如果它是虚拟的,或者可能重命名避免混淆的方法(如果他们也控制所有客户)。
答案 1 :(得分:-4)
对于动物类public virtual void Say()
。对于猫public override void Say()
。然后始终定义Animal类型的对象:
Animal my_cat = new Cat();
my_cat.Say();