显然你不能在override
修饰符中使用virtual
修饰符。
virtual
- 可重写的方法
override
- 重写其父类中同名方法的方法
这使我相信,如果我在子类中重写一个方法,如果这个子类有一个子类,那么你就不能再次重写那个方法。
如果在C#中在方法声明中同时放置override
和virtual
,则会得到编译错误。
然而,我不明白为什么我下面所做的代码会以它所期望的方式工作。
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
中的绘制方法似乎被LittleLine
覆盖了。 这段代码实际上没有覆盖它吗,还是编译器做了其他的技巧? 或者我没有理解虚函数和覆盖的上下文?
override
方法会自动再次变成可重写 (virtual
)。 - H Hsealed override
禁止在派生类中进一步重写该方法。还有一个有趣的细节:abstract override
强制要求派生类重写该方法。你的类可能不提供基类虚拟方法的重写实现,但你可以强制从你继承的类对其进行重写。 - pnvn