c# - 当我更改继承类中同名方法的代码时,我不需要使用属性覆盖和虚拟。这是为什么?

我正在尝试自学 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 所暗示的,您的问题归结为 overridenew 关键字之间的区别。

让我们看看是什么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 and override keywords. The override modifier extends the base class virtual method, and the new 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

python - 如何自定义条形注释以不显示选定值

computer-vision - 不同相机 View 之间的映射

python - IPywidgets 观察包裹在一个类中时不起作用

python - TensorFlow 安装错误,未启用 Windows LongPath 支持

kubernetes - 如何在我的 Kubernetes 容器中安装 tar 二进制文件以使 ku