跳至主要內容

LincZero大约 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.不要过多地使用反射
    • 反射机制使得人们可以通过在运行时查看域和方法,让人们编写出更具有通用性的程序。 这种功能对于编写系统程序来说极其实用,但是通常不适于编写应用程序。
    • 反射是很脆弱的,即编译器很难帮助人们发现程序中的错误