类间关系与复用

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

  • 泛化
  • 实现

水平方向:

  • 关联
  • 依赖

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 
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 
#include 
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;
}

类间关系与复用_第1张图片
(关联类可以是一个,也可以有多个)

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

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

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

  • 聚合
  • 组合

依赖关系

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

应用:黑盒复用与白盒复用
类间关系与复用_第3张图片
(二进制代码即可)

类间关系与复用_第4张图片

你可能感兴趣的:(C++面向对象程序设计,c++,开发语言)