【发布时间】:2009-08-05 19:25:36
【问题描述】:
我已经找到了大量的实际示例,并且了解覆盖或隐藏方法时的实际输出,但我正在寻找一些关于为什么会这样以及为什么 C# 根据规则允许它的幕后信息对于多态性,这是不允许的——至少,就我对多态性的理解而言(这似乎与 Wikipedia/Webopedia 上的标准定义一致)。
Class Base
{
public virtual void PrintName()
{
Console.WriteLine("BaseClass");
}
}
Class FirstDerived : Base
{
public override void PrintName()
{
Console.WriteLine("FirstDerived");
}
}
Class SecondDerived : Base
{
public new void PrintName()
{
Console.WriteLine("SecondDerived");
}
}
使用以下代码:
FirstDerived b = new FirstDerived();
BaseClass a = b;
b.PrintName();
a.PrintName();
我明白了:
首先派生 第一派生
好的,我明白了,有道理。
SecondDerived c = new SecondDerived();
BaseClass a = c;
c.PrintName();
a.PrintName();
我明白了:
SecondDerived
BaseClass
好的,这也是有道理的,实例 a 看不到 c.PrintName() 所以它使用自己的方法来打印自己的名称,但是我可以使用以下方法将我的实例转换为其真实类型:
((SecondDerived)a).PrintName();
或
(a as SecondDerived).PrintName();
得到我期望的输出:
SecondDerived
那么幕后发生了什么?这对于多态性意味着什么?有人告诉我这个设施“破坏了多态性”——我猜根据定义,它确实如此。那正确吗?像 C# 这样的“面向对象”语言真的会让你打破 OOP 的核心原则之一吗?
【问题讨论】:
-
您在声明中遗漏了返回类型。
-
呸,所以需要智能感知:D
标签: c# oop polymorphism