一、继承与委托
继承(inheritanc)和委托(delegation)是两种常见的复用方式。
简单来说,继承是子类继承父类的属性、方法,可以添加新的属性、重写或重载父类的方法,或添加新的方法,在父类的基础上改动代码,以适应新的要求;委托是将一个类A作为另一个类B的属性,或在B中使用某方法时通过传入类A来使用A中的方法,达到代码复用的目的。
从适用性来讲,当两个类的主题结构相似,并且新类型和原类型没有冲突是适合使用继承,而新类型只用到原类型一小部分代码时适合使用委托,因为这可以避免将原类型的大量代码链接到新类型中。
在使用继承时,子类和父类应当符合LSP原则,即所有需要使用父类的地方都可以由子类代替,在实际重写父类方法时要做到:(1)子类的范围修饰符比父类更广;(2)子类的返回值协变;(3)子类的参数类型逆变(Java中需相同);(4)子类的异常类型协变;(5)父类不变量要保持;(6)规约更强(前置条件不能强化、后置条件不能若化)等等。
而在使用委托时,分为临时性委托和永久性委托两种类型,临时性委托只在调用方法时将待使用的类作为参数是传入,方法执行完毕委托即截止;
永久性委托通常将待使用的类作为待设计类一个属性,贯穿待设计类的始终,还可以根据可变化的程度进一步区分。