Is a 和Has a之间关系

 

by    http://hi.baidu.com/zhjunxue/blog/item/dc1082817f56a8d09123d981.html

 

 

Is a 和Has a之间关系

可以这样理解

汽车是一种交通工具: 汽车 is-a 交通工具
汽车有一个发动机: 汽车 has-a 发动机
is-a 一般是继承关系
has-a 一般是组合关系

或者这样理解;

"has a"关系即组合关系,通过定义类的属性的方式实现的;"is a"关系即继承关系,通过类继承实现

   如果你确定两件对象之间是is-a的关系,那么此时你应该使用继承;比如菱形、圆形和方形都是形状的一种,那么他们都应该从形状类继承而不是聚合。

如果你确定两件对象之间是has-a的关系,那么此时你应该使用组合;比如电脑是由显示器、CPU、硬盘等组成的,那么你应该把显示器、CPU、硬盘这些类聚合成电脑类,而不是从电脑类继承。

在面向对象编程(OOP)设计模式中,“is-a” has-a” 描述了两类重要的关系,用于明确实体之间的连接方式。 ### Is-A 关系 Is-A 表达的是继承或实现的关系。这种关系表示一个类是从另一个类派生出来的,即后者是前者的一种特殊形式。“is-a”意味着子类具备父类的一切特征行为,并且还可以增加额外的属性或者覆写现有的方法。简单地说就是:“A 是一种 B”。 举例说明: - 如果我们有一个 `Animal` 类,那么 `Dog` 就可以被认为是它的子类。此时可以说 `Dog is an Animal` (狗是一种动物)。这里 Dog 对象能够做所有 Animal 能做的事情,甚至更多特异性的动作如 barking。 ```java class Animal { void eat() {...} } class Dog extends Animal { void bark() {...} } ``` 在这个例子里面,`Dog` `Animal` 形成了典型的“is-a”关系,因为每个 `Dog` 都是一个具体的 `Animal`. ### Has-A 关系 Has-A 引入组合的概念,指的是某事物由其他部分组成而非从属的概念。换句话说就是一个对象包含另外一个独立存在的对象作为其组成部分之一,而不是通过继承获得该功能。这通常对应着关联、聚合以及合成等形式。“has-a”表明 A 包含了一个或多个类型的B实例。 举个实际的例子来看这个概念: 假设我们要建模一辆汽车(`Car`) ,每辆车都有引擎 (`Engine`) 。我们可以认为一辆车“拥有”或者说"具有"(has) 发动机,但发动机并不是车辆的一部分而是单独制造然后组装进来的。因此这里 Car has-an Engine. ```java class Engine {} class Car { private Engine engine; public Car(){ this.engine = new Engine(); } } ``` 在这里可以看到,尽管 `Car` 拥有了一个 `Engine` 的实例,但它并没有直接从属于它,所以这是典型的“has-a”关系。 --- 这两种关系帮助开发者理解怎样构建合理的类结构并选择合适的方式来组织代码,从而使系统既保持良好的可扩展性又不会过于复杂化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值