类与类之间主要有继承、依赖、关联、聚合、组合几种常用关系。类之间关系的强弱如下:继承 > 组合 > 聚合 > 关联 > 依赖。
概念讲解
依赖
依赖是类之间一种临时的使用关系。class A的成员函数中使用了class B,但class A的成员变量中没有class B的指针,class B 在 A的函数中一般作为局部变量、函数参数出现。
表现形式:
void A::func(…)
{
B b;
…
}
或
void A::func(B* p_b)
{
…
}
或
void A::func(….)
{
B::GetInstance()->funcb();
}
关联
关联是一种结构关系,给定一个连接两个类的关联,可以从一个类的对象关联到另外一个类的对象。相关联的两个类之间是平等的,不存在整体/部分关系。一般不推荐使用双向关联,因为双向关联实际上是一种循环依赖。
有向关联是一种特殊形式的关联,也是一种更强的依赖关系。A与B之间是平等的,不存在整体/部分或者隶属关系。class A知道class B的存在,而class B不知道class A的存在。class B一般以引用的形式出现在class A中,另外系统中常用的消息发送者和接收者之间都是一种关联关系。两个类之间存在1对1、1对多、多对多的关联,这个在类图上可以相应的进行表示。
表现形式:
class A
{
public:
SetB(B* p_b) { m_pb = p_b;}
private:
B * m_pb;
};
或:
void A::func()
{
SendSyncMessage(ID_B, xxx, x, xxx); //发送同步消息
}
聚合
聚合是一种特殊形式的关联。在有向关联的基础上,如果class A和class B之间有整体/部分的关系,则称为聚合。同一个对象可以被其它多个对象聚合。
表现形式:
class A
{
public:
SetB(B* p_b) { m_pb = p_b;}
private:
B * m_pb;
};
注:从表现形式上看不出聚合和关联的区别,二者主要是语义上的区别,聚合强调的是整体/部分或隶属关系,A中有一个(多个)B。
组合
组合是一种特殊形式的聚合。在聚合的基础上,如果Class A需要负责Class B的生命周期, A 销毁必然导致B销毁,则称为组合。同一个对象不可能被其它多个对象所组合。
表现形式:
class A
{
public:
A::A();
private:
B * m_pb;
};
A::A()
{
m_pb = new B;
}
A::~A()
{
delete m_pb;
}
继承
表现形式:
class A : public B
{
};
分析过程
依赖、关联、聚合、组合之间的关系,多数情况下都可以根据下面的流程图分析出来。
1743

被折叠的 条评论
为什么被折叠?



