您的位置:首页 > 其它

面向对象类之间的关系

2017-06-21 00:00 183 查看
在 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++ 不同的关系涉及到不同的内存管理,所以就没有然后了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息