C# 虚拟/覆盖,新的,未指定
我得到了C# 虚拟/覆盖,新的,未指定,c#,C#,我得到了virtual/override和new修饰符之间的差异。但是当我没有指定任何修饰符的时候呢 例如,我有Animal和Cat类(Cat继承Animal) Animal类具有以下方法: public void Say() { //做点什么 } 并且Cat类具有以下方法: public void Say() { //做点别的 } 当我使用这些方法时,它们就像我使用了new关键字一样工作 Visual Studio向我显示一条警告(如果打算隐藏,请使用新关键字) 当我没有指定关键字时,为什
virtual/override
和new
修饰符之间的差异。但是当我没有指定任何修饰符的时候呢
例如,我有Animal
和Cat
类(Cat
继承Animal
)
Animal
类具有以下方法:
public void Say()
{
//做点什么
}
并且Cat
类具有以下方法:
public void Say()
{
//做点别的
}
当我使用这些方法时,它们就像我使用了new
关键字一样工作
Visual Studio向我显示一条警告(如果打算隐藏,请使用新关键字)
当我没有指定关键字时,为什么编译器不会中断。它只是在一个小小的警告下神奇地工作。我可以使用一些严格模式,也可以在IDE中编辑设置
或者这可能是我没有得到的一个特性:)用于动物类
公共虚拟空间Say()
。对于Cat公共覆盖void Say()
。然后始终定义动物类型的对象:
Animal my_cat = new Cat();
my_cat.Say();
对于动物类
公共虚拟空间Say()
。对于Cat公共覆盖void Say()
。然后始终定义动物类型的对象:
Animal my_cat = new Cat();
my_cat.Say();
当我没有指定关键字时,为什么编译器不会中断
为了避免这个问题,Cat
最初有Say()
方法,然后Animal
的作者也想添加一个Say()
方法。就目前的方法而言,这不是一个突破性的改变——它将为Cat
的作者创建一个警告,但仅此而已。所有代码的行为都将保持不变。然后,Cat
的作者可以决定如何处理他们的Say
方法-添加new
修饰符,或者覆盖Animal.Say()
(如果是虚拟的),或者可能重命名该方法以避免混淆(如果它们也控制所有客户端)
当我没有指定关键字时,为什么编译器不会中断
为了避免这个问题,
Cat
最初有Say()
方法,然后Animal
的作者也想添加一个Say()
方法。就目前的方法而言,这不是一个突破性的改变——它将为Cat
的作者创建一个警告,但仅此而已。所有代码的行为都将保持不变。然后,Cat
的作者可以决定如何处理他们的Say
方法-添加new
修饰符,或者覆盖Animal.Say()
如果是虚拟的,或者可能重命名该方法以避免混淆(如果他们也控制所有客户端)。可能的重复只是一个警告,提醒你可能做错了什么。您可能是,并且应该说()是一个虚拟方法。新关键字只做一件事,它会抑制警告。@HansPassant,是的,我知道我做错了。我只是好奇为什么我可以跳过这么重要的关键字。你可以做错事,你并不总是有机会修改基类。有时它很有用,例如在Winforms中工作得很好。它严重依赖于反射,因此不容易被混乱的继承链破坏。它可能的重复只是一个警告,提醒您可能做了错事。您可能是,并且应该说()是一个虚拟方法。新关键字只做一件事,它会抑制警告。@HansPassant,是的,我知道我做错了。我只是好奇为什么我可以跳过这么重要的关键字。你可以做错事,你并不总是有机会修改基类。有时它很有用,例如在Winforms中工作得很好。它严重依赖于反射,因此不容易被混乱的继承链打破。据我所知,这根本不能回答问题。据我所知,这根本不能回答问题。