在 UML 类图中会用不同的方式标识类之间的关系,当时就觉得挺枯燥无味的。但是现在不觉得了,比如在《 Linux 多线程服务端编程》这本书中第一章,作者提到了面向对象类之间关系,然后分析了多线程环境下,析构函数的执行在不同的关系下会有哪些情况可能出现竞争。此时才觉得了解一下类之间关系的术语,对于阅读其他书籍或者文章还是很有必要的。另一方面,在 c++ 中不同的关系是通过实例连接,还是通过指针连接呢?由于涉及到指针方面,又不得不小心。
这篇文章主要参考这里,列出一些我觉得在 c++ 中比较典型的关系。
继承关系
继承关系不必多数,提到继承二次就明白了。继承关系表示一种 is-a-kind-of 关系,比如 Student 是 Person 的一种。
class Person {
protected:
std::string _name;
int _age;
}
class Student : public Person {
int _score;
int _class;
}
关联关系( association )
关联关系表示两个类之间有关联。两个类之间可以双向关联,此时可以 1 对 1 ,也可以 1 对 多,也可以多对多。也可以单向关联。比如生产者与消费者之间的联系、教师与学生之间的关系。不过讲道理从代码来说,关联关系的代码可以写成聚合关系,或者组合关系。
class Customer;
class Product {
std::vector<Customer*> _customers;
}
class Customer {
Product *_product;
}
class Student;
class Teacher {
std::vector<Student*> _students;
}
class Student {
std::vector<Teacher*> _teachers;
}
聚合关系( aggregation )
聚合关系表示整体与部分的关系。可以用 owns-a 来理解。在聚合关系中,部分对象属于整体对象的一部分,但是部分对象的生命周期不受整体对象控制,部分对象可以脱离整体对象存在。一句话就是,在 c++ 中整体类中定义的是部分类的指针。
如下代码中,_engine 成员是 Car 的一部分但 _engine 指向的对象是独立存在的。
class Engine {
}
class Car {
Engine *_engine;
}
组合关系( composition )
组合关系也表示整体与部分关系,与聚合关系不同的是,应该用 is-a-part-of 来理解组合关系。部分对象就是整体对象的一部分,整体对象控制着部分对象的生命周期。一句话就是,在 c++ 中整体类中定义的是部分类的实例。
所以上述代码可以通过如下方式实现。此时 _engine 作为 Car 对象的一部分。当然了到底是选择聚合关系实现还是组合关系实现,取决于现实中的需求。
class Engine {
}
class Car {
Engine _engine;
}
依赖关系
依赖关系其实就是类 A 的功能需要用到类 B ,但是在类 A 的成员变量中并不包含类 B ,每次使用时动态创建 B 对象,或者通过函数参数等方式传入。
最后
说到底还是 C# 这种动态内存管理的语言舒服,不管什么关系用了 class 就是引用。但是用了 c++ 不同的关系涉及到不同的内存管理,所以就没有然后了。
共同学习,写下你的评论
评论加载中...
作者其他优质文章