乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       lchjczw 2013-02-18

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

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

      先來看C++用類實(shí)現(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 如何巧妙的封裝以及隱藏實(shí)現(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的實(shí)現(xiàn)只暴露了接口給用戶,內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)都隱藏了起來,可是C++用類實(shí)現(xiàn)反而在頭文件暴露了實(shí)現(xiàn)細(xì)節(jié)。

      當(dāng)然用C++也可以做到只暴露接口給用戶,不過實(shí)現(xiàn)起來會(huì)比較復(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;
      }

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多