代码复用原则:合理使用类组合和类继承
2014-05-30 14:28
531 查看
继承和组合都可以达到代码复用的目的,但是组合比继承更具灵活性。
组合是通过引用已有类(一般为抽象类)或接口来实现复用的组合在运行时通过多态可以动态替换被组合的对象。
继承是通过以子类继承父类方式来使父类的非私有成员可以被其子类使用。继承在类编译时就确定了继承来的方法和
属性,无法在运行时动态改变从父类继承来的方法。如果继承得来的某个方法在子类中不适用,这时就需要重写该方
法。而这样又很有可能违反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就行
组合是通过引用已有类(一般为抽象类)或接口来实现复用的组合在运行时通过多态可以动态替换被组合的对象。
继承是通过以子类继承父类方式来使父类的非私有成员可以被其子类使用。继承在类编译时就确定了继承来的方法和
属性,无法在运行时动态改变从父类继承来的方法。如果继承得来的某个方法在子类中不适用,这时就需要重写该方
法。而这样又很有可能违反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就行
相关文章推荐
- 【转】代码复用原则:合理使用类组合和类继承
- 代码复用原则:合理使用类组合和类继承
- 设计原则:不要为了复用而使用继承
- JAVA 使用继承复用代码的陷阱与补救措施
- Java 代码复用(组合与继承)
- 【转】使用组合替代继承(面向对象软件设计的“开—闭”原则 )
- 用继承,组合复用代码及default的继承范围
- java 复用代码(组合与继承)
- 代码复用 -- 组合和继承
- java代码复用(继承,组合以及代理)
- 面向对象设计三大原则(封装变化点,对接口进行编程,多使用组合而不是继承)
- 设计原则:和继承相比,更推荐使用组合
- [导入]使用snipp dogg进行代码复用
- 组合还是继承,这是一个问题?——由模式谈面向对象的原则之多用组合、少用继承
- 面向对象的设计法则(1)——优先使用(对象)组合,而非(类)继承(转)
- 第7章 复用类(组合,继承,代理)
- 面向对象设计原则七 - 组合优先于继承
- JavaScript中使用构造函数实现继承的代码
- 设计模式----优先使用对象组合,而非类继承
- 组合还是继承,这是一个问题?——由模式谈面向对象的原则之多用组合、少用继承