首页 > 代码库 > 抽象类与接口

抽象类与接口

一、抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。在面向对象中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

举个例子,“水果”是个抽象类,指可以食用的植物果实和种子,有水分和糖分,但世界上不存在“水果”这个实实在在的东西,它只是一个定义。“苹果”、“香蕉”、“鸭梨”则是具体类,它们是现实世界中存在的东西,都具有水果的共性。

二、接口

接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。

举个例子解释一下,大雁属于鸟类,可以用翅膀飞;飞机属于交通工具,可以用引擎和机翼飞;风筝属于玩具,可以借助风力飞。因为不是所有的鸟、交通工具和玩具都能飞,所以想让它们飞的时候不能使用继承,它们是完全不同的对象,但有共性——都可以在天上飞,可以定义一个“飞”接口,利用多态性让它们三个分别以自己的方式实现“飞”这个接口。

三、抽象类与接口的异同

1.相同点:

1).都不能实例化。

2).包含未实现的方法声明。

3).派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员。

2.异同点:

1).抽象类可以给出一些成员的实现,接口却不包含成员的实现,抽象类的抽象成员可以被子类部分实现,接口的成员需要实现类完全实现。

2).一个类只能继承一个抽象类,但可以实现多个接口。

3).抽象类中可以有成员变量(包含静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的;而接口中不能有成员变量、常量、静态方法,只能有公共的属性。

4).从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确定,预先定义。也就是说抽象类是自底而上抽象出来的,接口是自顶向下设计出来的。

5).抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

3.二者的联系:

是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象,它们的共性就是抽象。如果只关注行为对象,也可以认为接口就是抽象类。


抽象类与接口