大约 2 分钟
继承的设计技巧
- 1.将公共操作和域放在超类
- 2.不要使用受保护的域
- 有些程序员认为,将大多数的实例域定义为protected是一个不错的主意,只有这样,子类才能够在需要的时候直接访问它们。 然而,protected机制并不能够带来更好的保护,其原因主要有两点。
- 第一,子类集合是无限制的,任何一个人都能够由某个类派生一个子类,并编写代码以直接访问protected的实例域,从而破坏了封装性。
- 第二,在Java程序设计语言中,在同一个包中的所有类都可以访问proteced域,而不管它是否为这个类的子类。 (这点与C++不同)
- 3.使用继承实现“is-a”关系
- 4.除非所有继承的方法都有意义,否则不要使用继承
- 假设想编写一个Holiday类。毫无疑问,每个假日也是一日,并且一日可以用Gregorian Calendar类的实例表示,因此可以使用继承 class Holiday extends GregorianCalender
- 很遗憾,在继承的操作中,假日集不是封闭的。在GregorianCalendar中有一个公有方法add,可以将假日转换成非假日
- 因此,继承对于这个例子来说并不太适宜
- 如果扩展LocalDate就不会出现这个问题。由于这个类是不可变的,所以没有任何方法会把假日变成非假日
- 5.在覆盖方法时,不要改变预期的行为
- 置换原则不仅应用于语法,而且也可以应用于行为
- 6.使用多态,而非类型信息
- 面对if-else代码时,都应该考虑使用多态性
- action1与action2表示的是相同的概念吗?如果是相同的概念,就应该为这个概念定义一个方法,并将其放置在两个类的超类或接口中
- 7.不要过多地使用反射
- 反射机制使得人们可以通过在运行时查看域和方法,让人们编写出更具有通用性的程序。 这种功能对于编写系统程序来说极其实用,但是通常不适于编写应用程序。
- 反射是很脆弱的,即编译器很难帮助人们发现程序中的错误