目录
1.将公共操作和字段放在超类中
-
就是将名字字段放在Person字段中,而没有把他重复的放在Employee和Student类中
2.不要使用受保护字段
-
protected机制并不能带来更多的保护
-
子类集合时无限制的,任何一个人都能够派生出这个类的子类,从而访问protected实例字段,从而破坏了封装性
-
在Java中,在同一个包的所有类都能访问受保护字段,而不需要知道是否是这个类的子类。
-
3.使用继承实现“is-a”关系
-
使用继承很容易达到节省代码的目的,但是有时候会被人很滥用
-
假设需要一个钟点工类,很容易被人们认为这个类是员工的子类,但是钟点工只有姓名和雇佣日期,而没有工资,但是有时薪
-
但这并不是一个好的主意,因为这样以来钟点工就有了时薪和工资两个字段,这在打印钟点工的信息时会产生很多麻烦
-
可见,钟点工和员工之间并不是“is-a”关系,钟点工不是特殊的员工。
4.除非所有的继承的方法都有意义,否则不要使用继承
-
假设想要编写一个Holiday类,毫无疑问,每个假日都是一天并且每一天都能用GregorianCalender类的一个实例,无疑,Holiday类继承了GregorianCalender类
class Holiday extends GregoianCalender{...}
-
但是在GregorianCalender类中,有一个方法add,这个方法用于将非假日,变为假日,但这对Holiday类时没有用,没有意义的,所以在继承的操作中,假日集合不是封闭的
-
显然,继承对这个例子不太合适
5.在覆盖方法时不要改变预期的行为
-
替换原则不仅应用于语法,更重要的是,它也适用于行为,在覆盖一个方法的时候=不应该毫无理由的改变方法的行为
6.使用多态,而不要使用类型信息
-
如果出现了下面的代码
if(x is of type 1){ action1(x); } if(x is of type 2){ action2(x); }
-
都应该考虑使用多态。
-
当action1和action2表示的是相同的概念吗?如果是相同的概念,就应该为这个概念定义一个方法,并将其放在两个类型的超类中
-
使用多态性固有的动态分配机制执行正确的动作
-
使用多态方法或者接口实现的代码,比使用多个类型检测的代码更容易维护和扩展