单个类
补充,如果Animal为抽象类,需要将类名写为 斜体 或 <<类名>>
多个类关系
| 关系类型 | 强度 | 生命周期 | UML表示 | 代码表现 | 典型场景 |
|---|---|---|---|---|---|
| 继承 | 最强 | 子类依赖父类 | △+实线 | extends | 动物-狗 |
| 实现 | 强 | 类依赖接口 | △+虚线 | implements | Flyable-鸟 |
| 组合 | 强 | 部分依赖整体 | ◆+实线 | 成员变量new | 房子-房间 |
| 聚合 | 中 | 部分独立 | ◇+实线 | 成员变量setter | 汽车-引擎 |
| 关联 | 弱 | 相互独立 | 实线/箭头 | 成员变量 | 老师-学生 |
| 依赖 | 最弱 | 临时性 | 虚线箭头 | 方法参数 | 报告-数据 |
cpp这些符号都是处于"大"的一边,比如聚合中◇就处于整体一端 聚合与关联以及继承和实现在cpp中代码基本类似,要从逻辑上区分他们
聚合与关联
聚合表示"整体-部分"关系(has-a),但部分可以独立存在,有层次感
关联表示两个类之间存在某种联系,一个类知道另一个类的属性和方法,两个类之间是平等的
继承与实现
- 继承实现代码中都表现为"继承"
- 实现借助于虚函数,表现的是具有某种能力can-do,如飞翔
- 继承表示父子类关系,is-a
以下是C++中六种类关系的简单代码示例,按照关系强度从强到弱排列:
1. 继承(Inheritance)
is-a关系
// 基类
class Animal {
public:
virtual void speak() { cout << "Animal sound" << endl; }
};
// 派生类(公有继承)
class Dog : public Animal {
public:
void speak() override { cout << "Woof!" << endl; } // 重写父类方法
};
2. 实现(Realization)
- 接口实现
// 接口(纯抽象类) ,有飞翔能力
class Flyable {
public:
virtual void fly() = 0; // 纯虚函数
};
// 实现类
class Bird : public Flyable {
public:
void fly() override { cout << "Bird flying" << endl; } // 必须实现
};
3. 组合(Composition)
contains-a强生命周期绑定
class Engine {
public:
void start() { cout << "Engine started" << endl; }
};
class Car {
private:
Engine engine; // 组合:car对象销毁后内部的engine成员也会销毁
public:
void start() { engine.start(); }
};
4. 聚合(Aggregation)
has-a弱生命周期绑定
class Wheel {
public:
void rotate() { cout << "Wheel rotating" << endl; }
};
class Car {
private:
Wheel* wheel; // 聚合:通过指针引用外部对象,使得两者生命周期解绑
public:
Car(Wheel* w) : wheel(w) {} void move() { wheel->rotate(); }
};
5. 关联(Association)
- 平等对象间的固定关系
class Student; // 前向声明
class Teacher {
public:
void teach(Student* s); // 关联关系(单向)
};
class Student {
public:
void learn() { cout << "Learning" << endl; }
};
void Teacher::teach(Student* s) { s->learn(); }
6. 依赖(Dependency)
- 临时性使用
class Data {
public:
void process() { cout << "Data processed" << endl; }
};
class Report {
public:
void generate(Data& d) { // 依赖:通过参数临时使用Data d.process(); }
};