Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 虚拟/覆盖,新的,未指定_C# - Fatal编程技术网

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中工作得很好。它严重依赖于反射,因此不容易被混乱的继承链打破。据我所知,这根本不能回答问题。据我所知,这根本不能回答问题。