虚拟/覆盖,新的和未指定的

时间:2015-01-28 13:13:38

标签: c#

我得到了virtual/overridenew修饰符之间的区别。但是当我没有指定任何修饰符的时候呢。

例如,我有AnimalCat个类(Cat继承Animal)。

Animal类有方法:

public void Say()
{
    // do something
}

Cat类有方法:

public void Say()
{
    // do something else
}

当我使用这种方法时,它们就像我使用new关键字一样工作。

Visual Studio向我显示警告(如果要隐藏,请使用新关键字)。

为什么在不指定关键字时编译器不会中断。它只是神奇地用了一点警告。我可以使用某些严格模式,也可以在IDE中编辑设置。

或者可能是我没有获得的功能:)

2 个答案:

答案 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();