C++类与类之间的关系

类之间的关系在大体上分为两种,一种是纵向的,另一种是横向的。

一、纵向的就是继承,它是OO的三个特征之一

 在UML中称作:

  • 泛化(Generalization) 表示为:实线+空心三角形 
  • 实现(Realization)      表示为: 虚线+空心三角形

泛化关系: 是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为。表示类与类之间的继承关系,接口与接口之间的继承关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。

实现关系: 是一种类与接口的关系, 表示类是接口所有特征和行为的实现。

二、横向关系,按UML关系分为4种

  • 依赖(Dependency),表示为:   虚线+箭头
  • 关联(Association), 表示为:   实线+箭头
  • 聚合(Aggregation),表示为:    空心菱形+实线
  • 组合(Composition),表示为:   实心菱形+实线

它们的强弱关系是:依赖 < 关联 < 聚合 < 组合 < 继承

1.依赖

依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。是一种使用的关系,  即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖.

表现在代码层面,例如如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。

// Car.h
class CCar{
    // Do something
};

// Person.h
#include "Car.h"
class CPerson{
    void MoveFast(CCar &pCar);
};

2.关联

关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定

表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

  • 双向关联是指双方都拥有对方的引用, 都可以调用对方的公共属性和方法
  • 单向关联是指只有某一方拥有另一方的引用, 这样只有拥有对方者可以调用对方的公共属性和方法
  • 自身关联是指拥有一个自身的引用
//1、双向关联
// Husband.h
#include "wife.h"
class CHusband{
public:
    CWife* pWife;
};

// Wife.h
#include "Husband.h"
class CWife{
public:
    CHusband* pHuband;
};


//2、单向关联
// Husband.h
class CHusband{
public:
    int nMoney;
    void GoShopping();
};

// Wife.h
#include "Husband.h"
class CWife{
public:
    CHusband* pHuband;
};

3.聚合

聚合是强版本的关联。它暗含着一种所属关系以及生命期关系。聚合是整体与部分的关系,且部分可以离开整体而存在,如,车和轮胎是整体和部分的关系,轮胎离开车还可以存在。他们可以具有各自的生命周期。

表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

4.组合

组合是关系当中的最强版本,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命期的关系。他同样体现整体与部分间的关系,但此时整体与部分是不可分的整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑。

表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

 

转自类之间的关系(C++)、看懂UML类图和时序图

你可能感兴趣的:(c++)