类图

250 阅读2分钟

单个类

image.png

补充,如果Animal为抽象类,需要将类名写为 斜体<<类名>>

多个类关系

关系类型强度生命周期UML表示代码表现典型场景
继承最强子类依赖父类△+实线extends动物-狗
实现类依赖接口△+虚线implementsFlyable-鸟
组合部分依赖整体◆+实线成员变量new房子-房间
聚合部分独立◇+实线成员变量setter汽车-引擎
关联相互独立实线/箭头成员变量老师-学生
依赖最弱临时性虚线箭头方法参数报告-数据

cpp这些符号都是处于"大"的一边,比如聚合中◇就处于整体一端 聚合与关联以及继承和实现在cpp中代码基本类似,要从逻辑上区分他们

  1. 聚合与关联

  • 聚合表示"整体-部分"关系(has-a),但部分可以独立存在,有层次感

  • 关联表示两个类之间存在某种联系,一个类知道另一个类的属性和方法,两个类之间是平等

  1. 继承与实现

  • 继承实现代码中都表现为"继承"
  • 实现借助于虚函数,表现的是具有某种能力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(); } 
};