我正在尝试自学 Csharp。我读到如果我想更改继承类Class2中的方法textmethod的代码,我必须在Class2中的方法前面写override,在base Class1中的方法前面写virtual。所以我认为如果没有这些属性,下面的文本方法将无法工作或改变。但是方法仍然得到更新,如果我创建 Class2 的实例,我会得到 Class2 文本方法的文本,当我使用覆盖/虚拟属性时,会发生完全相同的事情。我正在使用 .Net 6.0。我错过了什么?
namespace nn
{
public class Program
{
public static void Main(string[] args)
{
Class2 class2 = new Class2();
class2.textmethod();
Console.ReadKey();
}
}
public class Class1
{
public void textmethod()
{
Console.WriteLine("hello");
}
}
public class Class2 : Class1
{
public void textmethod()
{
Console.WriteLine("hello there");
}
}
}
最佳答案
正如 Jon Skeet 所暗示的,您的问题归结为 override
和 new
关键字之间的区别。
让我们看看是什么the official documentation不得不说:
In C#, a method in a derived class can have the same name as a method in the base class. You can specify how the methods interact by using the
new
andoverride
keywords. Theoverride
modifier extends the base class virtual method, and thenew
modifier hides an accessible base class method.
您可能想知道 new
可能来自哪里,因为您没有在方法声明中使用该关键字。但是,编译器会隐式地为您添加它。这样做它还会通过编译器警告通知您明确使用 new
关键字。
当在子类中使用与在父类中相同的方法签名而不特别使用 override
时,您在子类中隐式创建了一个具有相同名称的 new
方法隐藏它从父类继承的方法。因此,您最终会得到两个具有相同名称和签名的不同方法。一个在 Class1
中,一个在 Class2
中,并且根据您的实例在运行时的类型,它将选择要执行的方法。这意味着当使用以下代码时:
Class2 class2 = new Class2();
class2.textmethod();
它执行 Class2
中指定的方法(因为它隐藏了在 Class1
中声明的其他 textmethod()
)。
但是如果您按如下方式更改代码(请注意我们如何使用多态性将 Class2
实例分配给 Class1
类型的变量) :
Class1 class2 = new Class2();
class2.textmethod();
在这种情况下,将执行在 Class1
中声明的原始 textmethod()
。即使您的 class2
对象仍然是 Class2
类型,Class1
中的隐藏基方法也会被执行。
这就是override
的不同之处。它不是在 Class2
上创建第二个 textmethod()
,而是覆盖(字面意思是替换/扩展)在 Class1
中声明的方法>。这意味着无论您是否将 Class2
实例转换为 Class1
都没有关系,以 textmethod()
声明的任何一种方式Class2
中的将被执行。
我强烈建议您查看上面链接的文档。在深入研究 C# 中继承的细微差别时,还有更多类似的示例很有帮助 :)
https://stackoverflow.com/questions/69933038/
相关文章:
node.js - 在配置数据库时连接详细信息不可用 Digital Ocean
unit-testing - 使用 Jest 测试 Vue3 组件时如何模拟计算属性
python - 一段时间后 Discord api websocket 网关连接断开
git - 重新启用 Visual Studio Code GitHub 身份验证
c# - 由于 XmlSerialization (sgen.exe) 无法在 Visual Stu
computer-vision - 不同相机 View 之间的映射
python - IPywidgets 观察包裹在一个类中时不起作用