在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。
不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++ 这种编程语言只支持抽象类,不支持接口;而像 Python 这样的动态编程语言,既不支持抽象类,也不支持接口。
尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍然可以通过一些手段来模拟实现这两个语法概念。
1 抽象类与接水口的区别
1.1 java 如何定义抽象类的。
- 抽象类不允许被实例化,只能被继承
- 抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫作抽象方法。
- 子类继承抽象类,必须实现抽象类中的所有抽象方法。
1.2 java 如何定义接口。
- 接口不能包含属性(也就是成员变量)。
- 接口只能声明方法,方法不能包含代码实现。
- 类实现接口的时候,必须实现接口中声明的所有方法。
1.3 区别
- 抽象类实际上就是类,只不过是一种特殊的类,这种类不能被实例化为对象,只能被子类继承。
继承关系是一种 is-a 的关系,那抽象类既然属于类,也表示一种 is-a 的关系。 - 接口表示一种 has-a 关系,表示具有某些功能。对于接口,有一个更加形象的叫法,那就是协议(contract)。
2 抽象类和接口能解决什么编程问题?
2.1 抽象类
- 抽象类不能实例化,只能被继承。
继承能解决代码复用的问题。
多个子类可以继承抽象类中定义的属性和方法,避免在子类中,重复编写相同的代码。 - 编译器会强制要求子类重写 log() 方法
抽象类可以更优雅的实现多态。
2.2 接口
- 抽象类更多的是为了代码复用,而接口就更侧重于解耦
- 接口是对行为的一种抽象,相当于一组协议或者契约,
- 调用者只需要关注抽象的接口,不需要了解具体的实现,具体的实现代码对调用者透明。接口实现了约定和实现相分离,可以降低代码间的耦合性,提高代码的可扩展性。
3 如何决定该用抽象类还是接口?
-
如果我们要表示一种 is-a 的关系,并且是为了解决代码复用的问题,我们就用抽象类;
-
如果我们要表示一种 has-a 关系,并且是为了解决抽象而非代码复用的问题,那我们就可以使用接口。
-
从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码重复,然后再抽象成上层的父类(也就是抽象类)。
-
接口正好相反,它是一种自上而下的设计思路。
-
我们在编程的时候,一般都是先设计接口,再去考虑具体的实现。
网友评论