2011-01-06 106 views

回答

7

抽象意味着派生类被迫实现它,而虚拟这不是这种情况(它可以但不是必需的)。这源于这样一个事实,即一个抽象方法在虚拟方法中没有关联主体。

+0

你可以作为去至于说抽象方法也是一种(特殊的)虚拟方法。 – GolezTrol 2011-01-06 09:50:10

0

通过将成员定义为抽象,您正在定义一种占位符,而不提供任何默认实现。任何与基类交互的客户端代码仍然可以引用抽象占位符成员,在知道实例的具体类必须提供具体实现的情况下是安全的。

通过将成员定义为虚拟,可以启用派生类来提供一个将覆盖基类的实现。区别在于,如果派生类不提供自己的实现,则将使用基类中的实现。

考虑下面的C#示例类:

abstract class TaskBase { 
    public abstract void RunTask(); 
} 

class RoadNetwork { 
    public string GetCorrectSideToDriveOn() { return "left"; } 
} 

TaskBase类的设计迫使派生类中提供自己的执行RunTask()因为代码不会没有它编译。设计师有效地说:“任务必须可以运行,但您必须提供实施,因为没有有意义的默认设置。”

RoadNetwork类的设计原理不同:人谁实现了RoadNetwork会自动使用道路的正确一边开车,除非他们专门选择开车在错误的一边;)