代码改变世界

C/C++程序开发中实现信息隐藏的三种类型

2017-07-25 13:08  tlnshuju  阅读(771)  评论(0编辑  收藏  举报

不管是模块化设计,还是面向对象设计。还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求。以本人浅显的经验,把信息隐藏依照程度的不同分成(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 可见可用

也就是毫无隐藏而言了,程序设计中绝对要避免。