第6讲 组合与继承
- 格式:pptx
- 大小:120.78 KB
- 文档页数:23


组合优于继承原则
组合优于继承原则是一种软件设计原则,提倡在软件设计和开发过程中,要尽量使用
组合的方式,而不是实现继承的方式。
“组合优于继承”这一原则是从面向对象编程(OOP)发展而来的,是OOP开发的一个重要原则。
它提倡使用组合,而不是继承。
该原则有两个主要原因。
首先,继承作为一种类型的代码重用机制,具有一定的弊端——继承可能引入复杂性,并且会产生一些可能不易察觉的问题。
例如,当一个类继承了
另一个类时,它可能不知道继承来的类里面的某些方法有什么用,其次,继承是一种静态
的关系,而组合则可以创建动态关系,更灵活一些。
组合可以利用所有的类或者对象之间
的关系,让程序更灵活易于模块化和维护,这样,增加新功能时就不会影响到已有程序的
结构和特性,而继承很可能引发这样的问题。
继承也可以被认为是一种依赖,而组合则更像是一种聚合,也就是依赖的另一种类型。
组合更具多样性,因为它可以让你根据需要选择或换一种实现方式,而继承只能使用一种
实现方式;继承是一种强耦合,而组合则可以有效地减少强耦合,可以将组件(即组合的对象)包装起来,形成较为独立的功能模块。
另外,组合关系更加灵活,更新其中某个组件
是更容易的。
总结来说,组合优于继承是软件设计中一种非常实用的原则,可以有效提高程序的可
扩展性、灵活性和可维护性,一定程度上解决继承所带来的弊端,是软件设计中一种重要
的原则。
最近一个师弟问某实现是该用对象持有(其实就是组合)还是集成关系实现好。
所以就在这里简单的浅谈一下,仅是个人观点,仅供参考。
如果写的不对的地方请指出。
首先它们都是实现系统功能重用,代码复用的最常用的有效的设计技巧,都是在设计模式中的基础结构。
相信大家已了解的,类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用。
对象持有(其实就是组合)要求建立一个号的接口,但是整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可见的,故成为黑盒复用。
继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。
而组合这是运用于复杂的设计,它们之间的关系是在运行时候才确定的,即在对对象没有创建运行前,整体类是不会知道自己将持有特定接口下的那个实现类。
在扩展方面组合比集成更具有广泛性。
继承中父类定义了子类的部分实现,而子类中又会重写这些实现,修改父类的实现,设计模式中认为这是一种破坏了父类的封装性的表现。
这个结构导致结果是父类实现的任何变化,必然导致子类的改变。
然而组合这不会出现这种现象。
对象的组合还有一个优点就是有助于保持每个类被封装,并被集中在单个任务上(类设计的单一原则)。
这样类的层次结构不会扩大,一般不会出现不可控的庞然大类。
而累的继承就可能出来这些问题,所以一般编码规范都要求类的层次结构不要超过3层。
组合是大型系统软件实现即插即用时的首选方式。
在设计模式中这两个概念同时出现的地方就是Adapter模式:对象适配(组合)和类适配(继承)。
一般我们提倡用对象适配而不是类适配。
基于上面的原因。
还有就是在我们的Java和.NET这些完全面向对象的语言而言类的继承是单继承,取消了C++等的多继承。
下面放两个这两种方式的UML图:类适配图:对象适配图:最后还说一句,“优先使用对象组合,而不是继承”是面向对象设计的第二原则。
但并不是说什么都设计都用组合,只是优先考虑组合,更不是说继承即使不好的设计,应该用组合,应为他们之间也有各自的优势。
组合和继承例子组合和继承是面向对象编程中重要的概念,它们可以用来实现代码的重用和模块化。
下面将通过一些例子来说明它们的应用。
1. 组合:汽车和发动机的关系在一个汽车类中,可以包含一个发动机类的实例作为其属性。
这样,汽车类就可以通过调用发动机类的方法来控制发动机的运行。
同时,汽车类也可以定义自己的方法,如启动、停止等。
2. 组合:动物和身体部位的关系动物类可以包含多个身体部位类的实例作为其属性,如头部、四肢、尾巴等。
这样,动物类就可以通过调用身体部位类的方法来控制动物的行为,如张嘴、移动等。
3. 组合:电脑和硬件设备的关系电脑类可以包含多个硬件设备类的实例作为其属性,如显示器、键盘、鼠标等。
这样,电脑类就可以通过调用硬件设备类的方法来控制硬件设备的运行,如显示图像、输入文字等。
4. 组合:家具和家具部件的关系家具类可以包含多个家具部件类的实例作为其属性,如桌面、椅子背部、沙发靠背等。
这样,家具类就可以通过调用家具部件类的方法来控制家具的形状和功能。
5. 组合:聚会和参与者的关系聚会类可以包含多个参与者类的实例作为其属性,如朋友、家人、同事等。
这样,聚会类就可以通过调用参与者类的方法来控制聚会的活动,如交谈、玩游戏等。
6. 继承:动物和猫的关系猫类可以继承自动物类,这样猫类就可以继承动物类中的属性和方法,如呼吸、移动等。
同时,猫类还可以定义自己特有的属性和方法,如抓老鼠、喵喵叫等。
7. 继承:水果和苹果的关系苹果类可以继承自水果类,这样苹果类就可以继承水果类中的属性和方法,如生长、成熟等。
同时,苹果类还可以定义自己特有的属性和方法,如变红、结实等。
8. 继承:形状和三角形的关系三角形类可以继承自形状类,这样三角形类就可以继承形状类中的属性和方法,如面积、周长等。
同时,三角形类还可以定义自己特有的属性和方法,如判断是否为等边三角形等。
9. 继承:员工和经理的关系经理类可以继承自员工类,这样经理类就可以继承员工类中的属性和方法,如工作、休假等。