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
之前我曾经想过,我们只能在派生类中重新定义一个方法,如果它被定义为abstract
或virtual
,但是现在可以看到,我们可以隐藏父类方法通过在派生类中重新定义它。
虽然,我可以看到,通过更改代码的输出差异,我想知道,上述两种方法之间有什么区别以及为什么它会产生不同的输出。
答案 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
)声明的。
如果它既未标记virtual
或abstract
,则编译器会发出警告,因为将根据声明变量的类型来解析调用。