到底选择合成还是继承

无论合成还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如
何选择。
   如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择合成。也就是说,我们可嵌入一
个对象,使自己能用它实现新类的特性。但新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接
口。考虑到这种效果,我们需在新类里嵌入现有类的private 对象。
有些时候,我们想让类用户直接访问新类的合成。也就是说,需要将成员对象的属性变为public。成员对象
会将自身隐藏起来,所以这是一种安全的做法。而且在用户知道我们准备合成一系列组件时,接口就更容易
理解。car(汽车)对象便是一个很好的例子:

 1 //: Car.java
 2 // Composition with public objects
 3 class Engine {
 4 public void start() {}
 5 public void rev() {}
 6 public void stop() {}
 7 }
 8 class Wheel {
 9 public void inflate(int psi) {}
10 }
11 class Window {
12 public void rollup() {}
13 public void rolldown() {}
14 }
15 150
16 class Door {
17 public Window window = new Window();
18 public void open() {}
19 public void close() {}
20 }
21 public class Car {
22 public Engine engine = new Engine();
23 public Wheel[] wheel = new Wheel[4];
24 public Door left = new Door(),
25 right = new Door(); // 2-door
26 Car() {
27 for(int i = 0; i < 4; i++)
28 wheel[i] = new Wheel();
29 }
30 public static void main(String[] args) {
31 Car car = new Car();
32 car.left.window.rollup();
33 car.wheel[0].inflate(72);
34 }
35 } ///:~

由于汽车的装配是故障分析时需要考虑的一项因素(并非只是基础设计简单的一部分),所以有助于客户程
序员理解如何使用类,而且类创建者的编程复杂程度也会大幅度降低。
如选择继承,就需要取得一个现成的类,并制作它的一个特殊版本。通常,这意味着我们准备使用一个常规
用途的类,并根据特定的需求对其进行定制。只需稍加想象,就知道自己不能用一个车辆对象来合成一辆汽
车——汽车并不“包含”车辆;相反,它“属于”车辆的一种类别。“属于”关系是用继承来表达的,而
“包含”关系是用合成来表达的。

时间: 2024-08-01 22:41:54

到底选择合成还是继承的相关文章

9:合成与继承

合成:在一个类中置入另一个类的句柄,该类是原始类的一种拓展.比如”汽车“类即是”轮胎“类的一种拓展. 继承:以extends作为标志,表示该类属于其父类的一个子类.比如”自行车轮“类即是”轮胎“类的一种子类. 具体在实际中的用法得看两个类之间的关系,是同一类,还是拓展类. 由于初学,对此点不是很清楚,以后有更深的理解的话会拓展.

侃侃Thinking In Java

我是从Bruce Eckel的网站开始,读Thinking In Java 1st edition的,那是2000年左右.实话实说,对于TIJ,我又喜欢又讨厌它. 又喜欢又讨厌 正如大多数同学所感觉的,TIJ偏重于介绍面向对象的"思想",而不是像绝大多数(国内的)<Xxx程序设计>之类的书籍,前者是思想流派,后者是语法流.这点很吸引我,而且,这也是我写<编程导论(Java)>时学习的地方. 但,我并没有完整地读完TIJ,因为 我不喜欢他的讲述方式.Bruce E

读TIJ -6 类再生

<Think in java·第 6 章类再生> 读TIJ -1 对象入门 中已经就代码复用性吐槽了.继承关系在结果上(不是为了代码复用而设计继承关系)为代码复用提供了新的途径. 本章看其目录就比较杂,程序员的内聚思想去哪儿了?合成复用优先--合成.继承,为什么实现继承是不好的-- 6.1 合成的语法 解释了一个例程,没有什么好说的.has_a关系. 6.2 继承的语法 [You can think of inheritance, then, as reusing the class.]Is_

继承与合成

在阅读本文之前,你只需要记住我这一句: 大部分使用继承的场合后可以用合成来取代,而多重继承则需要不惜一切地避免之. 首先我详细介绍一下继承的概念: ''' 什么是继承? 继承就是用来指明一个类的大部分或全部功能都是从一个父类中获得的. 比如class Foo(Bar):创建一个叫Foo的类,并让它继承Bar. 当你这样写的时候,Bar的实例所具有的功能都工作在Foo的实例上. 当你这么做的时候,父类和子类有三种交互方式: 1.子类上的动作完全等同于父类上的动作. 2.子类上的动作完全覆盖了父类上

day24 继承 接口 多态

抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 class Alipay: ''' 支付宝支付 ''' def pay(self,money): print('支付宝支付了%s元'%money) class Applepay: ''' apple pay支付 ''' def pay(

Python全栈之路系列----之-----面向对象4接口与抽象,多继承与多态)

接口类与抽像类 在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念 编程思想 归一化设计: 1.接口类 不实现具体的方法,并且可以多继承 2.抽象类 可以做一些基础实现,并且不推荐多继承 编程的几类原则: 开放封闭原则:对扩展示开放的,对修改是封闭的依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该应该依赖细节:细节应该依赖抽象.换言之,要针对接口编程,而不是针对实现编程接口隔离原则:使用多个专门的接口,而不使用单一的总接口.

【转】java提高篇(二)-----理解java的三大特性之继承

[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句话中最引人注目的是"复用代码",尽可能的复用代码使我们程序员一直在追求的,现在我来介绍一种复用代码的方式,也是java三大

python面向对象之继承与派生

一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的话,继承顺序有深度和广度2种 示例: class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass

【转载】Javascript原型继承-学习笔记

阮一峰这篇文章写的很好 http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html 笔记如下: 一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(p