继承和组合都可以达到代码复用的目的,但是组合比继承更具灵活性。
组合是通过引用已有类(一般为抽象类)或接口来实现复用的组合在运行时通过多态可以动态替换被组合的对象。
继承是通过以子类继承父类方式来使父类的非私有成员可以被其子类使用。继承在类编译时就确定了继承来的方法和
属性,无法在运行时动态改变从父类继承来的方法。如果继承得来的某个方法在子类中不适用,这时就需要重写该方
法。而这样又很有可能违反LSP设计原则。如果父类非私有成员发生了改变那么继承他的子类也不得不发生改变父类改
变。所以这种复用方式仅限于行为上的IS-A关系时才使用.
网络的例子:
t:如果你要用到一个类中的所有方法但还想多几个方法(你自己写)一起用,你有什么方法实现,
s:一般我会直接继承它,估计是答错了,能否继续把你的话说完。
t: 就单个实现来说没有正确错误之分
你如果是用继承来解决这个问题就是采用了高耦合的手段
也就是说子类B包含了超类A,子类B对超类A有强的依赖性
继续:
当B对A的依赖性是稳定的,用继承不会有任何问题
但当B有变心,希望有一个长得象A,但是某些实现上与A有所不同的伙伴的话,由于是继承就不行了。也就是A与B都
要重新定义
如果我们最初就发现了B比较花心,那就不用继承,用聚合来完成
也就是B中包含A的实例变量,由B的构造函数传入A的实例
那只要写个A的子类A1
在实例B的时候传入不同的A就行