面向对象类之间的关系
2017-06-21 00:00
183 查看
在 UML 类图中会用不同的方式标识类之间的关系,当时就觉得挺枯燥无味的。但是现在不觉得了,比如在《 Linux 多线程服务端编程》这本书中第一章,作者提到了面向对象类之间关系,然后分析了多线程环境下,析构函数的执行在不同的关系下会有哪些情况可能出现竞争。此时才觉得了解一下类之间关系的术语,对于阅读其他书籍或者文章还是很有必要的。另一方面,在 c++ 中不同的关系是通过实例连接,还是通过指针连接呢?由于涉及到指针方面,又不得不小心。
这篇文章主要参考这里,列出一些我觉得在 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++ 不同的关系涉及到不同的内存管理,所以就没有然后了。相关文章推荐
- 【面向对象程序设计常见面试题】类和对象之间的关系是什么?(11)
- 【面向对象程序设计常见面试题】多继承与虚函数之间的关系(已阅)
- 【学习笔记11】java面向对象-接口与类、接口与接口之间的关系
- 面向对象 - 类之间的关系
- 面向对象 类与类之间的关系
- JAVA面向对象-----接口与类、接口之间的关系
- 面向对象设计对象之间关系---依赖、关联、聚合和组合
- 面向对象三种模型之间的关系
- 面向对象OO——类之间的关系
- 面向对象的基本概念(二)--UML.类之间的关系
- JAVA面向对象-----接口与类、接口之间的关系
- 面向对象之继承(类与类之间的关系)
- 面向对象----浅述对象之间的关系
- 面向对象: 类之间关系
- 面向对象思想和面向对象设计原则之间的关系
- 面向对象的基本概念(二)--UML.类之间的关系
- 面向对象中类与类之间的关系
- 面向对象进阶之类和类之间的关系
- 面向对象设计类之间关系
- 面向对象的基本概念(二)--UML.类之间的关系