c# - 当我可以在派生类中隐藏它时,为什么我需要声明一个虚拟方法

标签 c# .net oop inheritance virtual

class clsTestParent
    {
       public void testNoAbstract()
        {
            Console.WriteLine("Parent Method Call");
        }
    }

    class clsDerivedTest : clsTestParent
    {
     public void testNoAbstract()
        {
            Console.WriteLine("Child Method Hiding Parent Method");
        }
    }

            clsTestParent objParent = new clsTestParent();
            clsTestParent objOfParentFromDerived = new clsDerivedTest();
            clsDerivedTest objDerived = new clsDerivedTest();

            objParent.testNoAbstract();
            objOfParentFromDerived.testNoAbstract();
            objDerived.testNoAbstract();

Output:
Parent Method Call
Parent Method Call
Child Method Hiding Parent Method

但是当我将 testNoAbstract() 声明为虚拟并在派生类中覆盖时,输出将如下所示:

Parent Method Call  
Child Method Hiding Parent Method
Child Method Hiding Parent Method

以前我认为,我们只能在派生类中重新定义一个方法,如果它被定义为abstractvirtual,但现在可以看到,我们可以通过在派生类中重新定义它来隐藏父类方法。

虽然,我可以通过更改代码看到输出的差异,但我想知道,上述两种方法之间的差异是什么,以及为什么会产生不同的输出。

最佳答案

如果您将永远执行clsTestParent a = new clsDerivedTest () - 您将永远无法执行clsDerivedTest 类中的那个!!!!

这就是区别,这就是编译器警告您的原因。

如果你想预先形成一个多态架构,你实际上会这样做。

Microsoft 告诉您:“听着,您创建了一个类,我们将为您提供所有公共(public)内容等,但我们不知道您希望如何实现这些方法……如果您”将使用 virtual + override - 你将能够通过 instace 类型执行不同的方法。如果你不重写 - 所以父亲的功能将始终执行......这是你的选择......我们警告你“......他们确实警告

关于c# - 当我可以在派生类中隐藏它时,为什么我需要声明一个虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8051897/

相关文章:

java - 井字游戏错误

javascript - js继承和原型(prototype)赋值

c# - 在不知道类型的情况下返回通用对象?

c# - 拆分文本和转换 linq

c# - 如何在 C# 的 SqlDataAdapter 中使用 WHERE

c# - 不同类型的列表列表

c# - 线程终止时调用方法

c# - 在 C# 中从队列中出列字节的最有效方法

c# - HttpWebRequest C# 的 API 超时错误 |与 postman 和 restsharp 一起工作

c++ - 如何在 main 之外的函数中创建对象?