Oop 抽象的和虚拟的意思是一样的吗?

Oop 抽象的和虚拟的意思是一样的吗?,oop,language-agnostic,terminology,Oop,Language Agnostic,Terminology,根据不同的语法以及在哪里可以使用,它们看起来都非常密切相关。主要区别是什么 abstract意味着派生类被迫实现它,而使用virtual则不是这样(它可以,但不是必需的)。这源于这样一个事实:抽象方法没有关联的主体,而虚拟方法有关联的主体。通过将成员定义为抽象,您定义了一种占位符,而不提供任何默认实现。任何与基类交互的客户端代码仍然可以引用抽象占位符成员,因为实例的具体类必须提供了具体的实现 通过将成员定义为虚拟成员,可以使派生类提供将重写基类实现的实现。区别在于,如果派生类不提供自己的实现,则

根据不同的语法以及在哪里可以使用,它们看起来都非常密切相关。主要区别是什么

abstract意味着派生类被迫实现它,而使用virtual则不是这样(它可以,但不是必需的)。这源于这样一个事实:抽象方法没有关联的主体,而虚拟方法有关联的主体。

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

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

考虑以下C#示例类:

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

class RoadNetwork {
    public string GetCorrectSideToDriveOn() { return "left"; }
}
TaskBase
类的设计强制派生类提供自己的
RunTask()
实现,因为没有它,代码就无法编译。设计者实际上是在说“任务必须是可运行的,但您必须提供实现,因为没有有意义的默认设置。”


道路网络
类的设计工作方式不同:任何实施
道路网络
的人将自动使用正确的道路一侧继续行驶,除非他们特别选择在错误的一侧行驶;)

你甚至可以说抽象方法也是一种(特殊的)虚拟方法。