• c++接口实现与分离(转载)


    原文地址:http://www.360doc.com/content/13/0218/10/8363527_266294787.shtml

    良好的设计应该只暴露接口给用户,所有的实现细节对用户来说应该是隐藏的,也就是说用户只要给接口传递相应的参数就行了,不需要管内部是如何实现的,比如我们使用fopen,fseek,CreateWindow等函数会发现很好用,而不需要管fopen,fseek,CreateWindow函数内部代码是如何实现的,数据结构是如何组织的,也就是说绝对不能暴露任何的细节给用户,包括数据组织在内。

    我现在用C和C++举一个例子,来说说C/C++分别是如何实现的,然后来看看哪种实现更好。

    先来看C++用类实现的封装:

    --------------------------- interface1.h ---------------------------

    #ifndef INTERFACE1_H
    #define INTERFACE1_H

    class DATA
    {
    private:
        int _i;
        short _j;

    public:
        DATA();
        ~DATA();

        void set(int i, short j);
        void get(int* i, short* j);    
    };

    #endif

    --------------------------- interface1.cpp ---------------------------

    #include "interface1.h"

    DATA::DATA()
    {
        _i = _j = 0;
    }

    DATA::~DATA()
    {
        _i = _j = 0;
    }


    void DATA::set(int i, short j)
    {
        _i = i;
        _j = j;
    }

    void DATA::get(int* i, short* j)
    {
        *i = _i;
        *j = _j;
    }

    --------------------------- test.cpp ---------------------------

    #include <stdio.h>
    #include "interface1.h"

    int main()
    {
        DATA data;
        int i;
        short j;

        data.set(2, 3);
        data.get(&i, &j);
                
        printf("i = %d, j = %d ", i, j);    

        return 0;
    }
     


    再来看 C 如何巧妙的封装以及隐藏实现细节:

    ---------------------------  interface.h  ---------------------------

    #ifndef INTERFACE_H
    #define INTERFACE_H

    void* data_create();
    void data_set(void* dummy, int i, short j);
    void data_get(void* dummy, int* i, short * j);
    void data_destroy(void* dummy);

    #endif

    ---------------------------  interface.c  ---------------------------

    #include <stdlib.h>

    struct DATA
    {
        int i;
        short j;
    };

    void* data_create()
    {
        return malloc(sizeof(struct DATA));
    }

    void data_set(void* dummy, int i, short j)
    {
        struct DATA* data = dummy;

        data->i = i;
        data->j = j;
    }

    void data_get(void* dummy, int* i, short * j)
    {
        struct DATA* data = dummy;

        *i = data->i;
        *j = data->j;
    }

    void data_destroy(void* dummy)
    {   
        free(dummy);
    }

    ---------------------------  test.c  ---------------------------

    #include <stdio.h>
    #include "interface.h"

    int main()
    {
        int i;
        short j;

        void* data = data_create();

        data_set(data, 2, 3);

        data_get(data, &i, &j);    
        printf("i = %d, j = %d ", i, j);

        data_destroy(data);

        return 0;
    }
     


    可以看的出来,C的实现只暴露了接口给用户,内部的实现细节都隐藏了起来,可是C++用类实现反而在头文件暴露了实现细节。

    当然用C++也可以做到只暴露接口给用户,不过实现起来会比较复杂,而且需要消耗更多的内存(使用了虚函数)。

    -------------------------------------- parent.h --------------------------------------

    #ifndef PARENT_H
    #define PARENT_H

    class PARENT
    {
    public:
        virtual void set(int i, short j) = 0; 
        virtual void get(int* i, short* j) = 0;
    };

    PARENT* get_child();

    #endif

    -------------------------------------- parent.cpp --------------------------------------

    #include "parent.h"
    #include "child.h"

    PARENT* get_child()
    {
        return new CHILD;
    }

    -------------------------------------- child.h --------------------------------------

    #ifndef CHILD_H
    #define CHILD_H

    #include "parent.h"

    class CHILD : public PARENT
    {
    private:
        int _i;
        short _j;

    public:
        CHILD();
        ~CHILD();

        void set(int i, short j);
        void get(int* i, short* j);    
    };

    #endif

    -------------------------------------- child.cpp --------------------------------------

    #include "child.h"

    CHILD::CHILD()
    {
        _i = _j = 0;
    }

    CHILD::~CHILD()
    {
        _i = _j = 0;
    }


    void CHILD::set(int i, short j)
    {
        _i = i;
        _j = j;
    }

    void CHILD::get(int* i, short* j)
    {
        *i = _i;
        *j = _j;
    }

    -------------------------------------- test.cpp --------------------------------------

    #include <stdio.h>
    #include "parent.h"

    int main()
    {    
        int i;
        short j;

        PARENT* parent = get_child();

        parent->set(2, 3);
        parent->get(&i, &j);
                
        printf("i = %d, j = %d ", i, j);    

        return 0;
    }
  • 相关阅读:
    HDU 1242——Rescue(优先队列)
    [LeetCode] Rectangle Area
    iOS 开发百问(6)
    lucene入门查询索引——(三)
    lucene入门创建索引——(二)
    lucene简介——(一)
    Java基础打包以及批处理命令运行
    Maven从私服上下载所需jar包——(十四)
    Maven部署dao工程到私服上——(十三)
    Maven私服安装及配置——(十二)
  • 原文地址:https://www.cnblogs.com/wyc199288/p/5877105.html
Copyright © 2020-2023  润新知