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
以前我认为,我们只能在派生类中重新定义一个方法,如果它被定义为abstract
或virtual
,但现在可以看到,我们可以通过在派生类中重新定义它来隐藏父类方法。
虽然,我可以通过更改代码看到输出的差异,但我想知道,上述两种方法之间的差异是什么,以及为什么会产生不同的输出。
最佳答案
如果您将永远执行clsTestParent a = new clsDerivedTest ()
- 您将永远无法执行clsDerivedTest 类中的那个!!!!
这就是区别,这就是编译器警告您的原因。
如果你想预先形成一个多态架构,你实际上会这样做。
Microsoft 告诉您:“听着,您创建了一个类,我们将为您提供所有公共(public)内容等,但我们不知道您希望如何实现这些方法……如果您”将使用 virtual + override - 你将能够通过 instace 类型执行不同的方法。如果你不重写 - 所以父亲的功能将始终执行......这是你的选择......我们警告你“......他们确实警告
关于c# - 当我可以在派生类中隐藏它时,为什么我需要声明一个虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8051897/