两个类依赖的优先方案是抽象依赖。为了使代码之间的依赖成为抽象依赖,根据依赖倒转原则,我们在编程时通常会使得实现类依赖于一个接口类或一个抽象类。这里主要讨论下依赖接口与抽象类的优缺点。
1、 抽象类是可以有代码实现的,而接口中则不会存在具体的代码实现。这对于抽象类的好处是:抽象类可以方便地增加新的方法,其所有子类不需要修改代码就可以获得到这个方法属性;而如果在接口中新增一个方法,那么需要其所有实现类都新增这个方法,如果实现子类较多将会是一件很痛苦的事情。
2、 对于所有java类都可以实现多个接口,但是只能有一个超类。如果一个实体类依赖于多个接口,可以使用一个实现类来完成所有的接口功能;而如果是依赖于多个抽象类,那么就必须实现多个不同的实现类。
3、 也因为第二点区别,使得抽象子类只有一个主要类型,而接口实现类却可以有主要类型和次要类型。这里的主要类型、次要类型可以理解为向实体类提供的主要服务和次要服务。例如HashMap,它的主要类型为Map,次要类型包括Serializable的可序列化。
可以看出抽象类与接口各有优缺点。为了能够在依赖编程中综合接口和抽象类的优点,可以使用下面的方式进行:
1、 抽象类可以实现多个接口,并可以对部分方法有代码实现。
2、 所有实现类都通过继承抽象类实现
3、 如果有需要增加新的方法,需要在接口、抽象类和需要进行的实现类中修改代码,而不用每一个子实现类都修改代码。