<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      厚積薄發
      海納百川,有容乃大
      以前在設計DirectUI界面庫(該界面庫現已開源, 可到 這里 下載)架構時,遇到一個接口繼承相關的問題,當時沒有太好的解決方案,卻一直個耿耿于懷, 現在重新思考整理下。

      我們的DirectUI控件層次大概如下: 

      其中, 類名以 I 開頭的都是接口:
      IObject表示框架的基本接口, 要求實現類似COM里IUnknown的功能,
      IControl表示控件的基本接口, 所有控件都從該接口繼承,
      IControlContainer表示容器類控件的基本接口,
      IButton表示Button類的基本接口,
      IPanel表示某種容器控件接口。
       
      當然上面的框架是簡化的情況,實際情況比上面的復雜的多, 但該圖已經可以幫我們說明這里的情況。

      在真正實現Panel和Button時,我們會發現大量的代碼是重復和可以共用的,因此在實際實現時, 我們的框架可能會變成這樣:

      也就是說我們會出現接口和實現交叉繼承的情況,實際上我自己在實現時就是用這種方法的, 我想大部分人都會用這種方法(實際上WPF也是用這種方法的)。
      這種方法的缺點是顯而易見的, 接口中包含了實現,基本上讓接口失去了它應有的作用, 這在組件式編程中是致命的,比如本來在C++中我可以封裝成DLL,然后以類似COM的方式暴露接口給外部, 現在用這種方式卻沒法做到了(只能用導出類的方式)。

      那么我們怎樣才能既基于接口編程, 又能在實現時實現代碼重用呢? 這個東西實際上是個語法糖, 即如何既符合C++語法又能實現我們這個需求。

      于是,我們想到了如下的實現方式: 

      我們的這種實現方式基于C++模板, 總的來說就是把我們要實現的接口通過模板參數傳到繼承類體系的最底層, 該方式的代碼大概如下:
      class IObject
      {
      };

      class IControl: public IObject
      {
      };

      class IButton: public IControl 
      {
      };

      template<typename TBase>
      class CObjectImpl: public TBase
      {
      };

      template<typename TBase>
      class CControlImpl: public TBase
      {
      };

      template<typename T, typename TBase>
      class CButtonImpl: public TBase
      {
      };

      class CButton: public CButtonImpl<CButton, IButton>
      {
      };

      該方式基本上完全滿足我們上面的需求,既實現了代碼重用,又是基于接口編程,但是你有沒有發現它有一個致命的缺點, 這個缺點就是C++模板導致的代碼膨脹, 我們在 C++模板會使代碼膨脹嗎 對模板導致的代碼膨脹有相關分析。也就是說我們上面的設計會導致每種控件繼承類都有一份重復的代碼, 即CControlImpl<IButton>和CControlImpl<IPanel>因為是不同的類實例, 因此它們會生成2分代碼。你可能會覺得這個不算什么, 但是想想控件的繼承類可能有好幾十甚至上百,最終的可執行文件會被撐大不少。

      那么有沒有其他的方法來實現呢?  既能基于接口編程, 又能實現代碼重用,還沒有代碼膨脹的問題。

      于是,我們想到了下面這種實現方式:




      這種方式是最原始的方式, 實際上就是把接口體系單獨獨立出來, 把實現體系也單獨獨立出來,  然后在最終類(Button和Panel)里繼承組合起來。 當然這種方式也有缺點, 就是我們要多做些工作,因為我們要在最終類(Button)里實現接口(IButton), 在實現時我們要把所有接口需要實現的方法轉發給實現類(CButtonImpl)。

      最后,總結下上面三種方法:
      第一種實現和接口混合繼承的方法最簡單,也最容易理解, 缺點是沒法完全基于接口編程; 第二種基于模板的方法比較難理解,實現上也比較簡單, 缺點是代碼膨脹; 第三種多重繼承的方法也比較容易理解, 缺點是我們要多做一些工作。

      我暫時就想到這些方法, 不知道其他朋友對上面的問題一般是怎么解決的, 有什么好的解決方法?
      posted on 2013-02-08 20:01  Richard Wei  閱讀(1640)  評論(2)    收藏  舉報

      主站蜘蛛池模板: 中文字幕第一页国产| 国产一区二区三区在线看| 人人超碰人摸人爱| 亚洲精品中文字幕在线观| 狠狠色噜噜狠狠狠狠777米奇| 亚洲高清成人av在线| 高清国产av一区二区三区| 国产精品老年自拍视频| 扒开粉嫩的小缝隙喷白浆视频| 国产精品久久无码不卡黑寡妇| 合山市| 二连浩特市| 狠狠色噜噜狠狠狠狠av不卡| 国产成人午夜福利院| 十八禁国产一区二区三区| 熟妇好大好深好满好爽| 久久精品夜色噜噜亚洲aa| 中文字幕国产精品自拍| 日韩欧美不卡一卡二卡3卡四卡2021免费| 国产av寂寞骚妇| 午夜福利日本一区二区无码| 日韩精品中文字幕第二页| 大香伊蕉在人线国产最新2005| 日本欧美一区二区三区在线播放| 国产又色又爽又黄的视频在线| 国产精品久久久天天影视香蕉| 三级黄色片一区二区三区| 老熟妇性老熟妇性色| 国产天美传媒性色av高清| 中文字幕制服国产精品| 国产最新进精品视频| 国产99精品成人午夜在线| a片在线免费观看| 国产成人精品性色av麻豆| 二区中文字幕在线观看| 国产精品日日摸夜夜添夜夜添无码 | 亚洲综合成人一区二区三区| 亚洲国模精品一区二区| 在线A毛片免费视频观看| 色综合久久精品亚洲国产| 国产va在线观看免费|