图像和声音文件(5)
4.除非所有继承的方法都有意义,否则不要使用继承。
Calendar类的实例表示,因此可以使用继承。
class Holiday extends GregorianCalendar (...)
add,这个方法可以将假日转换成非假日:
Holiday christmas;
christmas.add(Calendar.DAY_OF _MONTH,12);
因此,继承对于这个例子来说并不太适宜。
周能,能不说真能e就不会出现这个问题。由于这个Loeaoate类是不可是所以没有任何方法能够把假日变成非假日。
5.在覆盖方法时,不要改变预期的行为。
答换原用不仅应用于消法,更重要的是,它也适用于行为。在覆盖一个方法的时候,应该毫无缘由楚改变它的行为。就这一点而言,编译器不会提供任何帮助,即编译器不会查重新定义的方法是否有意义。例如,可以重新定义toliday类中的add方法来“修正”这个方法的问题,可能什么也不做,或者抛出一个异常,或者是前进到下一个假日。然而,这样一个“修正”违反了替换原则。对于以下语句序列
int dl = x.get(Calendar.DAY_OF _MONTH);
x.add(Calendar.DAY OF MONTH, 1);
int d2 = x.get(Calendar.DAY_OF MONTH);
System.out.println(d2-d1);
不管×的类型是GregorianCalendar还是Holiday,执行上述语句后都应该得到预期行为。当然,这是个难题。理智和不理智的人们可能就预期行为是什么争论不休。例如,有些人争论说,替换原则要求Manager.equals忽略bonus字段,因为Employee.equals就忽略了这个字。实际上,凭空讨论这些问题毫无意义。归根结底,关键在于在子类中覆盖方法时,不要离最初的设计想法。
6.使用多态,而不要使用类型信息。
只要看到类似下面的代码
if (x is of type 1)
action1(x);