类与类的关系(横向关系)

Posted stu-jyj3621

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与类的关系(横向关系)相关的知识,希望对你有一定的参考价值。

依赖关系

  • 可以简单的理解,类A依赖于类B就是类A使用到了类B,类B的变化会影响到类A
  • 这种关系一般是偶然性的、临时性的、非常弱的依赖关系总是单向的
  • 表现在代码层面,类B作为参数或局部变量被类A在某个方法中使用,此时类A依赖于类B

UML表示:

类A依赖于类B,用由类A指向类B的带箭头虚线表示

例子:

技术图片

class Driver
{
public:
    dirve(Car car)
    {
        car.move();
    }
    ......
};

class Car
{
public:
    void move()
    {
        ......
    }
}

关联关系

  • 关联是类与类之间的一种强依赖关系
  • 这种关系一般具有长期性 关联可以是单向、双向的
  • 关联可分为一对一关联、一对多关联、多对多关联
  • 表现在代码层面:
  1. 被关联类B以类的属性形式出现在关联类A中
  2. 关联类A引用了一个类型为被关联B的全局变量

UML表示

  • 用带箭头实线表示,箭头指向被关联类
  • 若是双向关联,实线两端可不带箭头

例子:

技术图片

 

双向关联:

 技术图片

class Customer
{
private:
    Product[] products;
    ......
};

class Product
{
private:
    Customer customer;
    ......
};

单向关联:

技术图片

class Customer
{
private:
    Address address;
    ......
};

class Address
{
    ......
};

聚合关系

  • 关联关系的一种特例
  • 体现的是整体与部分的关系,即has-a的关系,整体与部分之间可分离,具有各自的生命周期
  • 比如计算机与CPU、公司与员工、班级和学生
  • 表现在代码层面,和关联关系是一致的,只能从语义级别来区分

UML表示

以空心菱形加实线箭头表示

技术图片

class Car
{
private:
    Engine engine;

public:
    Car(Engine engine)
    {
        this->engine = engine;
    }
    void setEngine(Engine engine)
    {
        this->engine = engine;
    }
    ......
};

class Engine
{
    ......
};

组合关系

  • 也是关联关系的一种特例,体现的是一种contains-a的关系,比聚合更强,也称为强聚合
  • 体现整体与部分间的关系,但整体与部分具有相同生命周期,一旦整体对象不存在,部分对象也将不存在
  • 比如人和人的四肢
  • 表现在代码层面,和关联关系是一致的,只能从语义级别来区分

UML表示

以实心菱形加实线箭头表示

技术图片

class Head
{
private:
    Mouth *mouth;

public:
    Head()
    {
        mouth = new Mouth();
    }
    ......
};

class Mouth
{
    ......
};

is-a、has-a和is-like-a之间的关系

OOP编程思想中,继承是一个十分重要的内容。下面介绍几个 常见的容易混淆的术语。

首先举例子:

我们常见的动物,羊有很多种类,只是一种泛指,绵羊是其中一种,那么羊和绵羊的关系,就是is-a,即它们是继承的关系。

再如,羊身上都有羊毛,而不同种类的羊,羊毛生物形态也不同,比如绵羊和羚羊,前者羊毛丰富、蓬松、柔软,呈白色;后者羊毛稀少、刚硬,呈灰褐色。对于绵羊来说,羊毛和羊的关系就是has-a。对于羚羊也是同理。我们可以根据羊毛的不同,来区别羊的品种。

用自然语言来表述二者:

  • is-a: 这种事物(绵羊)是那种事物(羊)中的一个种类。
  • has-a:这种事物(羊毛)隶属于那种事物(绵羊),是它的一个部分、部件。

这种思想在OOP上,体现在哪方面呢?答案就是抽象类和接口的关系。

如下图:

 技术图片

图1 is-a与has-a之间的关系

   可以看到  MyClass 继承自 A,它们是is-a关系。

   MyClass实现了接口I,它们是has-a关系。

--------------------------------------------------------------------------

那么is-a和is-like-a啥关系呢?

同样,举例子,如图:

技术图片

总结就是: 

  •     如果继承过程中,仅仅是覆盖了父类中的方法,则为is-a关系。
  •     如果有新增的方法,则为is-like-a关系。

 

以上是关于类与类的关系(横向关系)的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象专题:类的空间问题类与对象之间的关系类与类之间的关系

java中类与类之间的关系讲解

Java 类与类的关联聚合继承实现关系

UML描述面向对象程序设计中类与类的关系

python类与类的关系

Python进阶编程 类与类的关系