根据不同的语法和可以使用的地方,它们似乎都非常密切相关。有哪些主要区别?
答案 0 :(得分:7)
abstract意味着派生类被强制实现它,而虚拟则不是这种情况(它可以但不是必需的)。这源于这样一个事实:抽象方法在虚拟方法的同时没有关联体。
答案 1 :(得分:0)
通过将成员定义为抽象,您将定义一种占位符,而不提供任何默认实现。与基类交互的任何客户端代码仍然可以引用抽象占位符成员,在知道实例的具体类必须提供具体实现的情况下是安全的。
通过将成员定义为虚拟,您可以启用派生类以提供将覆盖基类的实现。不同之处在于,如果派生类没有提供自己的实现,那么将使用基类中的实现。
考虑以下C#示例类:
abstract class TaskBase {
public abstract void RunTask();
}
class RoadNetwork {
public string GetCorrectSideToDriveOn() { return "left"; }
}
TaskBase
类的设计强制派生类提供自己的RunTask()
实现,因为如果没有它,代码将无法编译。设计师实际上是在说“任务必须是可运行的,但你必须提供实现,因为没有有意义的默认值。”
RoadNetwork
课程的设计工作方式不同:任何实施RoadNetwork
的人都会自动使用正确的路面开车,除非他们特意选择在错误的一侧开车;)