文章图片标题

Java抽象类解析

分类:架构设计 作者:阳光倾城 评论:0 点击: 494 次 日期:2016-08-06

Java语言里类分两种:具体类,抽象类。具体类可以实例化,抽象类不可以。

抽象类仅能提供一个类型的部分实现。可以有实例变量,以及一个或以上的构造方法。

可以同时拥有抽象方法和具体方法。

构造方法不能被客户端调用来创建实例,可以被子类调用,共享抽象类的实现并且子类可以在此基础上追加自己的实现。

抽象类、子类的关系时模板方法模式的应用。

抽象类代表抽象概念,提供继承的出发点。

具体类不是用来继承的,原则上,只要有可能,不要从具体类继承。

在一个继承关系形成的等级结构里面,树叶节点均应当使具体类,而树枝节点均应当使抽象类(或者Java接口)。

image

上图代码重构的例子就是里氏代换原则。

抽象类应当拥有尽可能多的共同代码。在一个抽象类到多个具体类的继承关系中,共同的代码应尽量移动到抽象类里。在一个继承的等级结构中,共同的代码应当尽量向等级结构的上方移动,

 

image

一个对象从超类继承而来的代码,在不使用时不会造成对资源的浪费。

策略模式中,抽象策略角色的分量越重越好,也就是说尽可能将公共的方法移动到抽象策略角色中,

image

 

抽象类应当具有尽可能少的数据。

数据的移动方向从抽象类到具体类,也即从继承的等级结构的高端向等级结构的低端移动。一个对象的数据不论是否使用都会占用资源,因此资源应当尽量放到具体类或者等级结构的低端。

image

基于抽象类编程,不要对具体子类编程,这就是依赖倒转原则。

正确使用继承,尽可能使用合成,而不用使用继承来达到复用的目的。

模板方法模式,是关于继承的模式。

继承代表一般化/特殊化关系,其中基类代表一般,衍生类代表特殊,衍生类将基类特殊化或扩展化。

使用继承关系场景:

1.子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分“Has-A”与“Is-A”两种关系的不同。Has-A关系应当使用聚合关系描述,而只有Is-A关系才符合继承关系。

2.永远不会出现需要将子类换成另一个类的子类情况。如果不是很确定一个类会不会在将来变成另一个类的子类的话,就不应当将这个类设计成当前这个超类的子类。

3.子类具有扩展超类的责任,而不是具有置换掉(Override)或注销掉(Nullify)超类的责任。如果子类需要大量地置换掉超类的行为,那么这个子类不应当成为这个超类的子类。

4.只有在分类学角度上有意义时,才可以使用继承,不要从工具类继承。

里氏代换原则是可否使用继承关系的标准。

image




声明: 除非注明,本文属( 阳光倾城 )原创,转载请保留链接: http://www.tomrrow.com/archives-7927.html