• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當(dāng)自強(qiáng)而不息

            一個用C/C++分別實現(xiàn)接口與實現(xiàn)相分離的設(shè)計原則的例子

             
            良好的設(shè)計應(yīng)該只暴露接口給用戶,所有的實現(xiàn)細(xì)節(jié)對用戶來說應(yīng)該是隱藏的,也就是說用戶只要給接口傳遞相應(yīng)的參數(shù)就行了,不需要管內(nèi)部是如何實現(xiàn)的,比如我們使用fopen,fseek,CreateWindow等函數(shù)會發(fā)現(xiàn)很好用,而不需要管fopen,fseek,CreateWindow函數(shù)內(nèi)部代碼是如何實現(xiàn)的,數(shù)據(jù)結(jié)構(gòu)是如何組織的,也就是說絕對不能暴露任何的細(xì)節(jié)給用戶,包括數(shù)據(jù)組織在內(nèi)。

            我現(xiàn)在用C和C++舉一個例子,來說說C/C++分別是如何實現(xiàn)的,然后來看看哪種實現(xiàn)更好。

            先來看C++用類實現(xiàn)的封裝:

            --------------------------- 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\n", i, j);    

                
            return 0;
            }
             


            再來看 C 如何巧妙的封裝以及隱藏實現(xiàn)細(xì)節(jié):

            ---------------------------  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\n", i, j);

                data_destroy(data);

                
            return 0;
            }
             

            可以看的出來,C的實現(xiàn)只暴露了接口給用戶,內(nèi)部的實現(xiàn)細(xì)節(jié)都隱藏了起來,可是C++用類實現(xiàn)反而在頭文件暴露了實現(xiàn)細(xì)節(jié)。

            當(dāng)然用C++也可以做到只暴露接口給用戶,不過實現(xiàn)起來會比較復(fù)雜,而且需要消耗更多的內(nèi)存(使用了虛函數(shù))。

            -------------------------------------- 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\n", i, j);    

                
            return 0;
            }

             

            posted on 2007-09-30 14:15 lovedday 閱讀(1494) 評論(2)  編輯 收藏 引用 所屬分類: ▲ C Program

            評論

            # re: 一個用C/C++分別實現(xiàn)接口與實現(xiàn)相分離的設(shè)計原則的例子 2009-01-06 10:52 開區(qū)間

            通俗易懂,謝謝  回復(fù)  更多評論   

            # re: 一個用C/C++分別實現(xiàn)接口與實現(xiàn)相分離的設(shè)計原則的例子 2009-01-06 11:18 開區(qū)間

            不過你并沒有完全實現(xiàn)接口和實現(xiàn)的分離,只不過接口暴露到了接口類中了。
            所以這篇文章,你沒有寫完。繼續(xù)吧!  回復(fù)  更多評論   

            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            国产成人香蕉久久久久| 97视频久久久| 精品久久久久中文字| 久久综合久久伊人| 久久狠狠爱亚洲综合影院| jizzjizz国产精品久久| 久久精品国产亚洲5555| 中文字幕久久精品无码| 国产精品久久波多野结衣| 中文字幕无码久久久| 国产精品一区二区久久| 亚洲人AV永久一区二区三区久久| 亚洲成色WWW久久网站| 久久精品99无色码中文字幕| 亚洲午夜久久久久久久久久| 久久综合九色综合久99| 久久永久免费人妻精品下载| 一本久久综合亚洲鲁鲁五月天| 成人妇女免费播放久久久| 久久精品亚洲AV久久久无码| 国产亚洲美女精品久久久| 久久精品国产91久久麻豆自制 | 久久久黄片| 国产精品一久久香蕉国产线看| 久久亚洲国产精品成人AV秋霞| 99热都是精品久久久久久| 久久99国产精品久久99果冻传媒| 中文无码久久精品| 亚洲综合精品香蕉久久网| 午夜精品久久久久久影视riav| 国内精品欧美久久精品| 久久精品中文闷骚内射| 亚洲国产另类久久久精品 | 无码日韩人妻精品久久蜜桃 | 午夜视频久久久久一区 | 99久久精品九九亚洲精品| 1000部精品久久久久久久久| 人妻无码αv中文字幕久久琪琪布| 久久精品国产亚洲AV香蕉| 久久国产色av免费看| 亚洲伊人久久大香线蕉综合图片|