您现在的位置是:首页 >技术教程 >类间关系与复用网站首页技术教程
类间关系与复用
简介类间关系
类间的逻辑关系:
垂直方向:
- 泛化
- 实现
水平方向:
- 关联
- 依赖
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;
}
(关联类可以是一个,也可以有多个)
一般关联强调非偶然性的“知道”。
- 一般关联
- 自关联
- 关联类
聚集关联:强调整体——部分关系
- 聚合
- 组合
依赖关系
注意:逻辑关系是程序员自己想的,仅从代码角度而言可能并不能区分。(甚至一段完全相同的代码可能既被认为是关联关系也是聚合关系)
应用:黑盒复用与白盒复用
(二进制代码即可)
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。