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

2tu*_*els 0 c#

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

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

Animal class有方法:

public void Say()
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

并且Cat类有方法:

public void Say()
{
    // do something else
}
Run Code Online (Sandbox Code Playgroud)

当我使用这种方法时,它们就好像我使用了new关键字一样.

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

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

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

Jon*_*eet 8

当我没有指定关键字时,为什么编译器不会中断.

为了避免"脆弱的基类"问题 - Cat原来有Say()方法的地方,然后Animal想要添加Say()方法的作者.使用当前的方法,这不是一个突破性的变化 - 它将为作者创建一个警告Cat,但这就是全部.所有代码的行为将保持不变.然后,作者Cat可以决定如何处理他们的Say方法 - 添加new修饰符,或者覆盖Animal.Say()它是虚拟的,或者可能重命名方法以避免混淆(如果他们也控制所有客户端).