继承与组合

来源:互联网 发布:js 窗口大小 编辑:程序博客网 时间:2024/04/26 21:45

 

1)       继承通过类继承重用父类代码,指定类Derived 继承自类Base,则一般情况下,类Derived不需要提供任何其它代码就可以当作类Base来使用。在代码重用的开始时期,使用继承更加方便

 

2)       组合通过在类A对象中增持B类对象(更一般情况下,使用B类对象的指针)、并在A对象中调用B类对象的方式来实现代码的重用。在代码重用的开始时期,使用组合更加麻烦,因为想要A表现出类似B的行为,必须在A中提供所有具有相似的B类的公有方法,并且在方法中传递给B类对象实现

 

3)       但是,继承时确定的类Derived和类Base之间的关系在编译时确定,无法在运行时修改。因此,无法在运行时修改Derived类的行为,缺少灵活性

 

4)       而由类A和类B确定的松耦合关系,特别是当A中包含B的指针时,可以通过运行时切换B指针,使其指向不同的B的派生类,从而改变类A的行为,增加灵活性

 

5)       继承具有适配接口的功能,即如果一个接口需要参数类型为Base,则可以传递Derived,而组合实现的类A,就算实现了B类所有的接口方法,也无法传递到需要B类接口的方法,反之亦然。因此,继承和组合可以合作。

 

6)       继承与组合合作的典型是Decorator设计模式(装饰者)。这种模式中,装饰者类A中包含被装饰者类B,通过对已有B类方法的调用进行包装、从而实现功能的扩充。由于A继承自B,从而在需要类B的地方,可以无缝地放入A。同时,由于A中持有B类的指针,因此,A中可以放置的实际对象不受限制,不只包括添加类A之前已经有的以B为基类的类对象,也包括所有尚未添加的其它装饰者类对象。在继承和组合的合作下,一方面,添加类A不需要修改现有的代码、且类A可融入已有程序,另一方面,添加类A后,允许更多个类A2A3的添加和进一步扩展,最终实现了“开放-关闭”原则。


 

原创粉丝点击