disp是什么意思?在公共汽车上
admin
2023-09-22 10:47:03
0

前言

在设计面向对象的系统时,我们需要根据系统的需求抽象出一些类,而设计好类之间的关系,设计出优秀的类间关系,是实现我们常说的‘高内聚低耦合’系统的前提。

阶级之间有什么关系?在哪些场景下如何使用哪种关系?

类关系的种类

实现关系

概念:

实现是指一个类可以实现接口interface(可以是多个)的功能,一个类可以实现多个接口。实现是类和接口之间最常见的关系。父类中有纯虚函数,子类中必须实现纯虚函数方法。

在UML类图的设计中,实现用带空心三角形箭头的虚线表示,箭头从类指向实现的接口。

图例:

继承关系

概念:

继承是指一个类(称为子类和子接口)继承了另一个类(称为父类和父接口)的功能,可以增加自己的新功能。

在UML类图的设计中,继承是用带空心三角形箭头的实线表示的,从子类到父类,或者从子接口到父接口。

图例:

依赖关系

概念:

指两个相对独立的物体。当一个对象负责构造另一个对象的实例,或者依赖于另一个对象的服务时,主要体现两个对象之间的依赖关系。

简单理解,依赖就是一个A类使用另一个B类,这种使用关系是偶然的、暂时的、非常微弱的,但是B类的变化会影响A类,比如有人要过河,需要借船,人和船的关系就是依赖。在代码层面上,类B用在类A中,其中类B用作类A的方法参数、方法中的局部变量或者静态方法调用。

在UML类图的设计中,从A类到b类的依赖关系用带箭头的虚线表示。

图例:

关联关系

概念:

关联反映了两个类在语义层面上的强依赖关系,比如我的朋友和我。这种关系强于依赖,没有依赖的偶然性,关系不是暂时的,一般是长期的,双方关系一般是平等的。

关联分为单关联和双向关联。单向关联表明在类A中使用了类B,其中B是类A的成员变量.双向关联如下:B类作为A类的成员变量;同时,a类也被用作b类中的成员变量。

在UML类图的设计中,关联关系用实线表示,箭头从关联的A类指向关联的B类,在关联的两端可以标注双方的角色和多重性标记。

图例:

聚合关系

概念:

聚集是关联的特例,耦合度强于关联,反映的是整体与部分的关系,即has-a与a的关系,此时整体与部分可以分离,可以有各自的生命周期,其中一部分可以属于多个整体对象或被多个整体对象共享。比如公司和员工,比如一个航母编队包括海空航母、驱逐舰、船艇等等。

在代码层面上,它与关系是一致的,这只能从语义层面来区分:关系的对象是相互独立的,而聚合关系的对象是包容的,是‘整体-个体’的关系,整体和部分可以独立存在。

在UML类图的设计中,聚合关系用空心菱形和实心箭头表示。

图例:

组合关系

概念:

组合也是关联的特例,体现了一种包含-一种关系。与聚集相比,组合是一种耦合性更强的关联,也称为强聚集。也体现了整体与部分的关系,但此时整体与部分是不可分割的。“整体”负责“部分”的生命周期,它们共存共死,这意味着整个生命周期的结束意味着某些部分生命周期的结束,比如人和他们的

在代码层面上,它与关系是一致的,这只能从语义层面来区分:关系的对象是相互独立的,而组合关系的对象是包容的,是‘整体-个体’的,整体与部分是不可分的。

在UML类图的设计中,组合关系用实心菱形和实心箭头表示。

图例:

类关系的区分方法

定义区分依赖、联想、聚合、组合这四种关系容易混淆。我们先来看看一些书中对这四种关系的定义。

依赖关系是类之间的联系。依赖意味着一个类依赖于另一个类的定义。比如一个人可以买车买房。Person类取决于Car类和House类的定义,因为Person类指的是汽车和房子。与association不同,Person类中没有Car和House类型的属性,Car和House的实例作为参数传递给buy()方法。一般来说,依赖关系在Java语言中体现为局部变量、方法的形参或对静态方法的调用。

关联(

Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。


聚合(Aggregation)关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。


组合(Composition)关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。

——摘自《Java面向对象编程》



C++代码实现区分

由前面的定义我们已经知道,依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,而组合则是一种更强的关联,所以笼统的来区分的话,实际上这四种关系、都是关联关系。但是在应用中具体怎么用代码实现的这几种关系的呢?


·依赖:

方式1.通过成员函数入参使用。

方式2.成员函数内new对象。

比如,男孩玩球。男孩和球是单独存在的,只是玩的时候才需要球这个对象,球被玩的生命周期只是在play函数内。

classBoy{public:voidplay(Ballball)//成员函数{//...其它代码处理//生命周期在当前函数内}voidplay()//成员函数{Ball*p_ball=newBall();//...其它代码处理}}

·关联:

通过成员函数入参赋值给成员变量。若类图中关联线是类A指向类B,则说明代码中类B的对象是类A的成员变量。

比如,汽车里面安装了音响设备。汽车和音响可以单独存在,音响也可以后期安装在车里。

classCar{public:voidplay(Audioaudio)//成员函数{this->audio=audio;//...其它代码处理}private:Audioaudio;//这个对象的生命周期与这个类一样}

·聚合:

比如,电脑由主机和显示器组成。主机和显示器可以独存在,而且即使没有显示器,电脑的还是可以使用的。但是在电脑类初始化时就需要主机和显示器数据(外界传入)。

classComputer{public:voidComputer(ComputerMianUnitcmu,ComputerDisplaycdisp)//构造函数{this->cmu=cmu;this->cdisp=cdisp;//...其它代码处理}private:ComputerMianUnitcmu;//这个对象的生命周期与这个类一样ComputerDisplaycdisp;//这个对象的生命周期与这个类一样}

·组合:

比如,电脑主机的主板、显卡等脱离了电脑主机后,电脑主机不能再运行了,必须在主机类初始化时就把这些设备包含进来(内部创建)。

classComputerMianUnit{public:voidComputerMianUnit()//构造函数{p_hd=newHardDisk();//这个对象的生命周期与这个类一样p_mb=newMemoryBank();//这个对象的生命周期与这个类一样p_gc=newGraphicsCard();//这个对象的生命周期与这个类一样//...其它代码处理}private:HardDisk*p_hd;//这个对象的生命周期与这个类一样MemoryBank*p_mb;//这个对象的生命周期与这个类一样GraphicsCard*p_gc;//这个对象的生命周期与这个类一样}


实际应用举例:

应用场景:

某个职员入职一家公司后,需要在公司的资源管理系统中录入办公电脑信息。

类设计图:

总结

对于继承、实现这两种关系体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、横向关系,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。

相关内容

热门资讯

第一次了解!全民游戏外挂辅助神... 您好,全民游戏这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,...
实测分享“红豆娱乐牛牛如何安装... 您好:红豆娱乐牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4194432】很多玩家在红豆...
第一次了解!淮滨麻将外挂辅助神... 第一次了解!淮滨麻将外挂辅助神器(确实有挂)原来真的有挂(有挂秘诀)详细教程(哔哩哔哩)是一款可以让...
分享实测“新天道牛牛透视辅助工... 您好:新天道牛牛这款游戏可以开挂,确实是有挂的,需要软件加微信【4194432】,很多玩家在新天道牛...
第一次了解!好友跑得快外挂辅助... 第一次了解!好友跑得快外挂辅助神器(确实有挂)原来真的有挂(有挂秘诀)详细教程(哔哩哔哩)是一款可以...