一、概念
CARP:CompositionAggregation Principle
合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承。合成聚合是“has a”的关系,而继承是“is a”的关系。由于继承是一中强耦合的结构,父类变,子类必变。所以不是“is a”关系,我们一般不要用继承。优先使用合成聚合复用原则,有助于保持每个类的封装,降低继承的层次。合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是;要尽量使用合成/聚合,尽量不要使用继承。
就是说要少用继承,多用合成关系来实现。我曾经这样写过程序:有几个类要与数据库打交道,就写了一个数据库操作的类,然后别的跟数据库打交道的类都继承这个。结果后来,我修改了数据库操作类的一个方法,各个类都需要改动。"牵一发而动全身"!面向对象是要把波动限制在尽量小的范围。
一句话点评:优生优育,不要盲目繁衍。
二、聚合与合成的优缺点:
优点:
1、新对象存取成分对象的唯一方法是通过成分对象的接口。
2、此原则是黑箱复用,因为成分对象的内部细节对新对象而言是看不到的。
3、此原则复用支持包装。
4、此原则复用所需的依赖较少。
5、每一个新的类可以将焦点集中在一个任务上。
6、此原则复用可以在运行时间内动态进行,新对象可以分理处态的引用与成分对象类型相同的对象。
缺点:
1、系统中会有比较多的对象需要管理
三、继承的优缺点:
优点:
1、新的实现较为容易,因为超类的大部分功能可以通过继承的关系自动进入子类。
2、修改和扩展继承而来的实现较为容易。
缺点:
1、继承复用破坏包装,因为继承将超类的实现细节暴露给子类。由于超类的内部细节常常是对于子类透明的,所以这种复用是透明的复用,又称“白箱”复用。
2、如果超类发生改变,那么子类的实现也不得不发生改变。
3、从超类继承而来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。