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

时间:2011-11-08 14:26:19

标签: 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();
  

输出:
  父方法呼叫
  父方法呼叫
  隐藏父方法的子方法

但是当我将testNoAbstract()声明为虚拟并且在派生类中过度使用时,输出将如下:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

这就是差异,这就是编译器警告你的原因。

如果您希望预先形成多态性架构,那么您实际上会这样做。

微软告诉你:“听,你是一个课,我们会给你所有的公共事物等但我们不知道你想如何实施这些方法...如果你' ll使用虚拟+覆盖 - 你可以通过instace类型执行不同的方法。如果你不会覆盖 - 所以父亲的功能将永远执行....它是你的选择...我们警告你“......他们确实发出警告

答案 1 :(得分:2)

这就是为什么'重新定义'对此有些不好的原因。虚拟调用可以解析您的类型运行时,这就是您能够:

的原因
    clsTestParent objOfParentFromDerived = new clsDerivedTest();
    objOfParentFromDerived.testAbstractOrVirtual(); // marked as virtual or abstract in base class

并且调用在运行时被解析为objOfParentFromDerived实际上是new运算符 - clsDerivedTest)的类中定义的方法,而不是类中定义的方法它是用(clsTestParent)声明的。

如果它既未标记virtualabstract,则编译器会发出警告,因为将根据声明变量的类型来解析调用。