“is a” 和”has a“

本文详细解释了isa和hasa在面向对象编程中的含义及应用场景,通过实例阐述如何正确地使用继承和聚合关系,提高代码的可读性和可维护性。

刚开始接触这两个词之后,脑子里还真没有概念,下面是自己学习的内容

“is a”代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机。PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用 Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。


“has a”代表的是对象和它的成员的从属关系。同一种类的对象,通过它们的属性的不同值来区别。比如一台PC机的操作系统是Windows,另一台PC机的操作系统是Linux。操作系统是PC机的一个成员变量,根据这一成员变量的不同值,可以区分不同的PC机对象。
再比如张三和李四都是人,但他们的名字不一样,可以以此区分这两个具体的人。名字应该作为人的成员变量。如果将名字叫“张三”的人和名字叫“李四”的人分别定义成两个类,均继承“人”这个类,显然是不合理的。

is a 的意识是如果A是B,那么B就是A的基类。比如:等边三角形是使是三角形,那么,三角形就是等边三角形的基类。


has a 是如果A中有B,那么,B就是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”关系。 --- 这两种关系帮助开发者理解怎样构建合理的类结构并选择合适的方式来组织代码,从而使系统既保持良好的可扩展性又不会过于复杂化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值