不管是模块化设计,还是面向对象设计。还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求。以本人浅显的经验,把信息隐藏依照程度的不同分成(1)不可见不可用(2)可见不可用(3)可见可用。
1 不可见不可用
就是说模块内部的变量、结构体、类定义对外部而已全然隐藏。外部对此一无所知。经常使用的实现方法就是利用不透明指针,请參见我的博文C语言开发函数库时利用不透明指针对外隐藏结构体细节。
这样的方法相同适用于C++语言。一种可能的实现方式为面向接口编程。
头文件 IMyClass.h
class IMyClass
{
public:
virtual ~IMyClass();
public:
virtual void public_function1();
virtual void public_function2();
};
IMyClass* CreateMyClassObject();
实现文件 MyClass.cpp
#include "IMyClass.h"
class MyClass : IMyClass.h
{
private:
int x;
int y;
int z;
public:
virtual void public_function1();
virtual void public_function2();
};
IMyClass* CreateMyClassObject()
{
return new MyClass();
}
这样的实现方法在源代码层次和库层次上都能适用。
理论上说。全然实现不可见是最完美的设计。然而这对于程序设计要求非常高。并且会带来很多其它的代码量和设计逻辑层次以及一些限制(如无法实现对已有类型的继承)。
所以,非常多C++库的设计都採用了以下这样的可见不可用的方式,如MFC。
2 可见不可用
这样的方法指的是专门针对C++而言的,指的是C++类中的非公开类型成员。比如在头文件 myclass.h中:
class MyClass
{
private:
int x;
int y;
int z;
protected:
float f;
public:
int M;
void member_method1();
};
对于调用方来说。包括次头文件后,尽管可以看到x,y,z等成员变量,可是却无法使用它们。仅仅要client须要使用 new 来生成实例或者继承类。就必须知道类的完整定义。
对C语言而言,不存在这样的情况,由于结构体里的不论什么变量都是公开的。
3 可见可用
也就是毫无隐藏而言了,程序设计中绝对要避免。