面向对象is-a,has-a,like-a,contains-a是什么

本文围绕Java中is-a、has-a、like-a三种设计思路展开。is-a代表继承,has-a是聚合,contains-a是更强的组合,like-a是实现。文中通过多个例子解释了这些关系,并说明了在不同关系下应采用的设计方式,如继承、聚合、组合等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、is-a,has-a,like-a是什么

在面向对象设计的领域里,有若干种设计思路,主要有如下三种: 
is-a、has-a、like-a 
java中在类、接口、抽象类中有很多体现。 
了解java看这里:什么是Java 
了解类和对象看这里:类、对象到底有什么秘密 
了解接口和抽象类看这里:接口和抽象类有什么区别

2、is-a(继承)

is-a,顾名思义,是一个,代表继承关系。 
如果A is-a B,那么B就是A的父类。 
一个类完全包含另一个类的所有属性及行为。 
例如PC机是计算机,工作站也是计算机,PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。 
了解更多继承看这里:java类的继承有什么意义

3、has-a(聚合

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系

看下面一段代码:

public class Family {
    private List<Child> children; //一个家庭里有许多孩子

    // ...
}

在代码层面,聚合和关联关系是一致的,只能从语义级别来区分。普通的关联关系中,a类和b类没有必然的联系,而聚合中,需要b类是a类的一部分,是一种”has-a“的关系,即 a has-a b; 比如家庭有孩子,屋子里有空调。 

但是,has 不是 must has,a可以有b,也可以没有。a是整体,b是部分,整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。

不同于关联关系的平等地位,聚合关系中两个类的地位是不平等。

4、contains-a(组合)

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。

先看一段代码:

public class Nose {
    private Eye eye = new Eye();  //一个人有鼻子有眼睛
    private Nose nose = new Nose();

    // .... 
}

组合同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。 

就像你有鼻子有眼睛,如果你一不小心结束了生命周期,鼻子和眼睛的生命周期也会结束,而且,鼻子和眼睛不能脱离你单独存在。

只看代码,你是无法区分关联,聚合和组合的,具体是哪一种关系,只能从语义级别来区分。

同样,组合关系中,两个类额关系也是不平等的。

5、 like-a(实现)

like-a,顾名思义,像一个,代表组合关系。 
如果A like a B,那么B就是A的接口。 
新类型有老类型的接口,但还包含其他函数,所以不能说它们完全相同。 
例如一台手机可以说是一个微型计算机,但是手机的通讯功能显然不是计算机具备的行为,所以手机继承了计算机的特性,同时需要实现通讯功能,而通讯功能需要作为单独接口,而不是计算机的行为。

6、is-a,has-a,like-a如何应用

如果你确定两件对象之间是is-a的关系,那么此时你应该使用继承;比如菱形、圆形和方形都是形状的一种,那么他们都应该从形状类继承。 
如果你确定两件对象之间是has-a的关系,那么此时你应该使用聚合;比如电脑是由显示器、CPU、硬盘等组成的,那么你应该把显示器、CPU、硬盘这些类聚合成电脑类。 
如果你确定两件对象之间是like-a的关系,那么此时你应该使用组合;比如空调继承于制冷机,但它同时有加热功能,那么你应该把让空调继承制冷机类,并实现加热接口。

Write a computer program that could be used to track, by lab, which user is logged into which computer: Lab Number Computer Station Numbers 1 1-5 2 1-6 3 1-4 4 1-3 ➢ You run four computer labs. Each lab contains computer stations that are numbered as the above table. ➢ Each user has a unique ID number. The ID starting with three characters (for example, SWE or DMT), and followed by three digits (like, 001). ➢ Whenever a user logs in, the user’s ID, lab number, and the computer station number are transmitted to your system. For example, if user SWE001 logs into station 2 in lab 3, then your system receives (SWE001, 2, 3) as input data. Similarly, when a user SWE001 logs off a station, then your system receives the user id SWE001. ➢ If a user who is already logged into a computer attempts to log into a second computer, display "invalid login". If a user attempts to log into a computer which is already occupied, display "invalid login". If a user who is not included in the database attempts to log out, display "invalid logoff". 输入格式 If user SWE001 is logged into station 2 in lab 3 and user DMT001 is logged into station 1 of lab 4, use + for logging in, - for logging off, and = for end of input: + SWE001 2 3 + DMT001 1 4 《面向对象程序设计 C++》 2022-2023 春季学期 2 / 4 - SWE001 = 输出格式 The status of all labs (who is logged into which computer). Otherwise, display invalid login or invalid logoff. You need to display the status of all labs even when the input is invalid.
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值