从语法特性、意义、应用来看“接口和抽象类的区别”

133 阅读2分钟

语法特性

抽象类不允许被实例化,只能被继承。它可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫作抽象方法。子类继承抽象类,必须实现抽象类中的所有抽象方法。

接口不能包含属性,只能包含方法,方法不能包含代码实现。类实现接口的时候,必须实现接口中声明的所有方法。

存在的意义

抽象类是对成员变量和方法的抽象,是一种 is-a 关系,是为了解决代码复用问题。

接口仅仅是对方法的抽象,是一种 has-a 关系,表示具有某一组行为特性,是为了解决解耦问题,隔离接口和具体的实现,提高代码的扩展性。接口定义具有某些功能,是一种 ”协议“,侧重于解耦。

用继承可以代替抽象类吗

1、用空的方法代替抽象方法,影响可读性;

2、可能忘记实现空方法,而抽象方法中,编译器会强制要求子类重写抽象方法。

如何模拟抽象类和接口

(1)模拟接口

  • 在C++ 中,可用抽象类来模拟接口
  • 对于不支持抽象类关键字、接口概念的动态编程语言(Python、Ruby等)怎么实现呢?

1、protected 修饰构造函数;

2、让类中的方法抛出 MethodUnSupportedException异常,强迫子类主动实现父类。

应用场景

在代码设计、编程开发的时候,什么时候该用抽象类?什么时候该用接口?

实际上,判断的标准很简单。如果我们要表示一种 is-a 的关系,并且是为了解决代码复用的问题,我们就用抽象类;如果我们要表示一种has-a 关系,并且是为了解决抽象而非代码复用的问题,我们就可以使用接口。

从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码复用,然后再抽象成上层的父类(也就是抽象类)。而接口正好相反,它是一种自上而下的设计思路。我们在编程的时候,一般都是先设计接口,再去考虑具体的实现。