【发布时间】:2012-06-28 17:44:46
【问题描述】:
显然,您不能将virtual 修饰符与override 修饰符一起使用。
virtual - 可以被覆盖的方法
override - 覆盖其父类中同名方法的方法
这让我相信,如果我在子类中重写了一个方法,如果那个孩子有一个孩子,你就不能再重写那个方法了。
可以肯定地说,如果您将override 和virtual 放在方法声明中,您将在C# 中得到编译错误。
但是我不明白为什么我在下面编写的代码会以它的方式工作
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("Drawing Object");
}
}
public class DrawDemo
{
public static int Main()
{
DrawingObject[] dObj = new DrawingObject[3];
dObj[0] = new DrawingObject();
dObj[1] = new Line();
dObj[2] = new LittleLine();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
Console.Read();
return 0;
}
}
public class Line : DrawingObject
{
public override void Draw()
{// the method above me is in fact virtual because LittleLine overid it?
Console.WriteLine("I'm a Line.");
}
}
public class LittleLine : Line
{
public override void Draw()
{
Console.WriteLine("I'm a Little Line.");
}
}
这是输出:
绘图对象
我是一条线。
我是一条小线。
所以Line 中的draw 方法看起来好像被LittleLine 覆盖了。这段代码实际上并没有覆盖它,还是编译器做了其他一些技巧?还是我不理解virtual 和override 的上下文?
【问题讨论】:
-
override方法再次被自动覆盖 (virtual)。 -
正如其他人所说,
sealed override不允许在派生类中进一步覆盖该方法。另一个有趣的花絮:abstract override强制派生类覆盖该方法。您的类可能不提供基类的虚方法的覆盖实现。但是,您可以强制派生自您的类覆盖它。 -
感谢您的澄清!
标签: c# polymorphism