漫谈接口和抽象类
接口和抽象类
接口的意义:
- 规范
接口是用来规范类的,它可以避免类在设计上的不一致,这在多人合作的开发中犹为重要;
它是一种标准,每一个实现它的类都要遵守这个接口定义的规则,标准。
- 扩展(解耦)
最大程度的解耦,方便以后项目扩展
Eg:OOP的思想,底层定义了规范,上层来负责实现,打个比方说,jdbc中就是定义了数据库操作的接口,然后不同的数据
库服务厂商实现不同的数据库操作。
- 回调(参见下一篇文章)
抽象类的意义:
- 为其子类提供一个公共的类型;
- 封装子类中的重复内容;
- 定义了抽象方法,子类虽然有不同的实现,但定义是一致的。抽象类设计出来就是为了继承,实现多态。
接口和抽象类对比
接口用来定义两个对象间通信的契约;
抽象类用来封装对象间公用的行为;
接口适合为不相关的类提供通用功能;
抽象类主要应用于关系密切的对象间;
实际编程中:
我们关心do what,但不关心 how to do,我们可以用接口;
我们既关心 what,又关心 how时,选用抽象类,但对象间对于某个what 时,how 却表现各异;当然,另一个what,
又how的一致;
将来想加个通用方法,抽象类中直接添加即可,继承的subClass无需任何更改;【模板式设计】接口如果添加,那所
有实现的类都需更改;【辐射式设计】
我们可能现有一堆类,后面才慢慢抽象出类的共同的方法,更多是重构产生的【自下而上】;接口是一开始就定义好
的一些规范【自上而下】
从继承角度来讲,如果类已经继承了一个父类,那此时就应该把这部分功能定义接口,实现多个接口是没有问题的,
但只能单继承;(java中)
扩展功能:将来某些具体类想扩展一项功能,如果直接在抽象类中添加该功能,那继承了该抽象类的另外一些具体类
是不想要这些功能的,由于继承,却也给这些类这个功能;
如果使用接口定义,哪些类想扩展功能,哪些类就实现接口即可;
好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。(如果一个类只是实现了这个接口的
中一个功能,而不得不去实现接口中的其他方法,就叫接口污染)
Eg:java中的 比较接口
对一类事物进行抽象用抽象类,对行为进行抽象时用接口。
java8中接口中方法可以有方法体,前提是 方法是 static;
接口中 :
变量默认是 public static final
方法默认是 public abstract
注:默认可以省略,但不能改变;具体看代码:
|
|
附加知识点:
抽象:就是抽去像的部分
开闭原则:
对修改关闭,对扩展开放;
通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层
次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。