抽象类:从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类。
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
运用要求:
C++
标准c++没有abstract关键字,代之使用纯虚类实现类似的功能。
在实现接口时,常写一个抽象类,来实现接口中的某些子类所需的通用方法,接着在编写各个子类时,即可继承该抽象类来使用,省去在每个都要实现通用的方法的困扰。
Java
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的。
抽象类不能使用new操作符创建它的实例。抽象方法只有定义而没有实现。它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。
抽象类的构造方法定义为protected.
抽象类GeometricObject为几何对象定义了共同特征,并且提供了合适的构造方法。
运用意义:
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
Java
假设在问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
使用abstract class方式定义Door:
abstractclassDoor{
abstractvoidopen();
abstractvoidclose();
}
使用interface方式定义Door:
interfaceDoor{
voidopen();
voidclose();
}
C++
为了让一个类成为抽象类,至少必须有一个纯虚函数。包含至少一个纯虚函数的类视为抽象类。
纯虚函数形式如下:
virtualreturntypefunction()=0;
例如,类A有两个纯虚函数lock()、unlock()和一个虚析构函数:
classA
{
public:
virtualvoidlock(void)=0;
virtualvoidunlock(void)=0;
virtual~A(void);
}
将函数lock()和unlock()初始化为0使它们成为纯虚函数,没有0这个初使化器,它们仅仅是虚函数。
classB:publicA
{
protected:
pthread_mutex_tx;
public:
B(void);
~B(void);
virtualvoidlock(void)
{
ead_mutex_lock(x);
}
virtualvoidunlock(void)
{
ead_mutex_unlock(x);
}
}