虚拟与抽象
Virtual和Abstract是大多数面向对象(OO)编程语言(如Java和C)中使用的两个关键字。尽管在不同的语言中它的含义略有不同,但虚拟关键字和抽象关键字都为它所附加的实体提供了一种部分实现的感觉。
摘要
通常,抽象类,也称为抽象基类(ABC),不能实例化(不能创建该类的实例)。因此,只有当编程语言支持继承(通过扩展类创建子类的能力)时,抽象类才有意义。抽象类通常表示一个抽象的概念或实体,有部分实现或没有实现。因此,抽象类充当从中派生子类的父类,这样子类将共享父类的不完整特性,并且可以添加功能来完成这些特性。抽象类可以包含抽象方法。扩展抽象类的子类可以实现这些(继承的)抽象方法。如果子类实现了所有这样的抽象方法,那么它就是一个具体类。但如果不是这样,子类也会变成抽象类。所有这一切意味着,当程序员指定一个类作为一个抽象类时,她是说这个类将是不完整的,它将有需要继承子类完成的元素。这是在两个程序员之间创建契约的好方法,它简化了软件开发中的任务。编写代码来继承的程序员需要严格遵循方法定义(当然也可以有自己的实现)。在Java和C中,抽象类和方法是使用Abstract关键字声明的。
事实上的
虚拟方法/函数提供了通过继承类(使用具有相同签名的函数)选择性重写其行为的能力。虚拟函数的概念在以下场景中很重要。假设一个类是由子类派生的,那么每当使用派生类的对象时,它可能引用基类或派生类的对象。但是,如果基类方法被重写,方法调用行为可能是不明确的。因此,为了解决这种模糊性,使用了虚拟关键字。如果方法标记为Virtual,则调用派生类的函数(如果有),否则调用基类的函数。例如,在C++中,虚拟关键字正好用于此目的。在C#中,Virtual关键字的使用方式类似,但除此之外,关键字重写应用于修改所有重写的方法。但是在Java中,没有显式的虚关键字。所有非静态方法都被认为是虚拟的。没有实体的虚函数称为纯虚函数。在Java和C中,抽象方法实际上是纯虚拟的。
虚与抽象的区别