语法特性
抽象类不允许被实例化,只能被继承。它可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫作抽象方法。子类继承抽象类,必须实现抽象类中的所有抽象方法。
接口不能包含属性,只能包含方法,方法不能包含代码实现。类实现接口的时候,必须实现接口中声明的所有方法。
存在的意义
抽象类是对成员变量和方法的抽象,是一种 is-a 关系,是为了解决代码复用问题。
接口仅仅是对方法的抽象,是一种 has-a 关系,表示具有某一组行为特性,是为了解决解耦问题,隔离接口和具体的实现,提高代码的扩展性。接口定义具有某些功能,是一种 ”协议“,侧重于解耦。
用继承可以代替抽象类吗
1、用空的方法代替抽象方法,影响可读性;
2、可能忘记实现空方法,而抽象方法中,编译器会强制要求子类重写抽象方法。
如何模拟抽象类和接口
(1)模拟接口
- 在C++ 中,可用抽象类来模拟接口
- 对于不支持抽象类关键字、接口概念的动态编程语言(Python、Ruby等)怎么实现呢?
1、protected 修饰构造函数;
2、让类中的方法抛出 MethodUnSupportedException
异常,强迫子类主动实现父类。
应用场景
在代码设计、编程开发的时候,什么时候该用抽象类?什么时候该用接口?
实际上,判断的标准很简单。如果我们要表示一种 is-a 的关系,并且是为了解决代码复用的问题,我们就用抽象类;如果我们要表示一种has-a 关系,并且是为了解决抽象而非代码复用的问题,我们就可以使用接口。
从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码复用,然后再抽象成上层的父类(也就是抽象类)。而接口正好相反,它是一种自上而下的设计思路。我们在编程的时候,一般都是先设计接口,再去考虑具体的实现。