> 文章列表 > 类间关系与复用

类间关系与复用

类间关系与复用

类间的逻辑关系
垂直方向:

  • 泛化
  • 实现

水平方向:

  • 关联
  • 依赖

1、类间关系的强弱——强关联
A.h必须包含B.h才能编译成功,则A和B之间存在强关联。

例一://b.h
#include "a.h"
class B{A mA;
};结论:尽可能不使用对象成员,而用指针或引用。例二://b.h
class B {public: void f(A * pA) {return pA->g();}
};结论:直接使用内联方式定义成员函数,可能增强文件的依赖性,可使用前置声明和外联实现避免。

2、类间关系的强弱——硬关联
A和B类间有双向关系,且B与A之间有强关联,那么A和B之间有硬关联。

//B.h
#include <A.h>
class B {
public:B();B(int);
private:A ma;	
};//A.h
class A {
public:A (int);B Foo();
private:	 int mData;
};

3、类间关系的强弱——弱关联
A.cpp中必须包含B.h才能编译通过,则A与B之间存在弱关联。

//B.h
class B {
public:B();B(int);
private:	
};//A.h
class B;
class A {
public:A (int);B func();
private:int mData;	
};//A.cpp
#include <A.h>
#include <B.h>
B A::func() {
return B(mData);
}结论:最常见的关联形式。

4、类间关系的强弱——软关联
A只使用了B的指针或引用,那么A和B之间存在软关联。

class B;
class A {
public: A (B * pb);
private: B * mpB;
}结论:使用指针或引用数据成员,函数参数以指针或引用形式传递,函数的返回值不要使用传值形式。(多用指针,因为如果使用引用的话可能需要自定义构造函数。)

降低编译期依赖性:
即尽可能指针或引用,而不是对象形式。
类间的联系依次减弱:
1、继承:类间的垂直关系
2、硬关联;
3、强关联;
4、弱关联;
5、软关联。

自定义类型的数据成员:

  • 使用指针形式
  • 引用形式的缺点:需提供构造函数(有的需拷贝构造函数)
  • 对象形式的缺点:提高了编译期的依赖性(但无需用户自己为其拷贝赋值)

函数的自定义类型参数:

  • 使用指针和引用形式

函数返回的自定义类型:

  • 尽可能不使用对象形式
  • 适当使用前置声明和外联实现

类间关系的代码形式(水平方向)

关联(强):
1、数据成员形式:
class B { A * mA };依赖(弱)(因为可能函数没有调用,而数据成员一定会使用):
2、函数参数:
class B {void Func(A * pA);
}3、函数返回值:
class B {A * Func1();
};4、函数实现:
int B::Func(int n){A * pa = new A;int val = pa->g() + n;delete pa;return val;
}

类间关系与复用
(关联类可以是一个,也可以有多个)

一般关联强调非偶然性的“知道”。

  • 一般关联
  • 自关联
  • 关联类

聚集关联:强调整体——部分关系

  • 聚合
  • 组合
    类间关系与复用
    类间关系与复用

依赖关系

类间关系与复用
注意:逻辑关系是程序员自己想的,仅从代码角度而言可能并不能区分。(甚至一段完全相同的代码可能既被认为是关联关系也是聚合关系)

应用:黑盒复用与白盒复用
类间关系与复用
(二进制代码即可)

类间关系与复用