继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

面向对象类之间的关系

c8we
关注TA
已关注
手记 6
粉丝 1
获赞 29

在 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++ 不同的关系涉及到不同的内存管理,所以就没有然后了。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP