【发布时间】:2015-06-07 20:28:12
【问题描述】:
有一个简单的问题,程序会在控制台打印什么?
我从没想过我会在这段代码上犯错。它的行为与我的逻辑预期相反。
如果有人能说明每行打印的原因,我将不胜感激。
另外,实例化一个新的 Circle 并将其转换为 Shape 是什么意思?为什么它也被视为椭圆?
非常感谢
编辑: 我被要求指定我期望的输出是什么。 所以:
创建一个圆形并将其转换为一个形状,我认为只有形状 C'tor 将被执行,因为它是一个形状。
如果自动调用 super() 有什么意义呢? Ellipse C'tor 执行了 Shape C'tor 中的代码。
为什么转换为Shape的x1.Draw()会执行Ellipse的Draw()的代码?如您所见,x1,x2 都打印了相同的消息。
希望我更清楚,谢谢。
namespace ConsoleApplication2
{
class Shape
{
public Shape()
{
Console.WriteLine("SHAPE CTOR");
}
public virtual void Draw()
{
Console.WriteLine("Shape.Draw()");
}
}
class Ellipse : Shape
{
public Ellipse()
{
Console.WriteLine("ELLIPSE CTOR");
}
public sealed override void Draw()
{
Console.WriteLine("ELLIPSE.Draw()");
}
}
class Circle : Ellipse
{
public static void Main()
{
Shape x1 = (Shape)new Circle();
Ellipse x2 = (Ellipse)new Circle();
Circle x3 = new Circle();
x1.Draw();
x2.Draw();
x3.Draw();
}
public void Draw()
{
Console.WriteLine("CIRCLE DRAW");
}
}
}
输出:
SHAPE CTOR
ELLIPSE CTOR
SHAPE CTOR
ELLIPSE CTOR
SHAPE CTOR
ELLIPSE CTOR
ELLIPSE.Draw()
ELLIPSE.Draw()
CIRCLE DRAW
【问题讨论】:
-
你能说得更具体点吗?您到底期望什么,为什么?
-
这是正常行为,除非您告诉我们您的预期,正如@O.R.Mapper 所说,我们不会知道您无法理解什么。否则,这将变成关于多态性和继承的重要课程......并且网上有很多资源。
-
我猜@johni 缺少 Circle 没有 ctor,这就是它在那里打印 shap 的原因。
-
为了您的方便,我已经编辑了我的帖子,很抱歉造成误解。
-
@peer:
Circle有一个 ctor(它在Main()的前三行中的每一行中都被调用),即使它不知何故没有,这不可能与多态行为。
标签: c# inheritance polymorphism