青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

以前在設(shè)計(jì)DirectUI界面庫(kù)(該界面庫(kù)現(xiàn)已開(kāi)源, 可到 這里 下載)架構(gòu)時(shí),遇到一個(gè)接口繼承相關(guān)的問(wèn)題,當(dāng)時(shí)沒(méi)有太好的解決方案,卻一直個(gè)耿耿于懷, 現(xiàn)在重新思考整理下。

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

其中, 類名以 I 開(kāi)頭的都是接口:
IObject表示框架的基本接口, 要求實(shí)現(xiàn)類似COM里IUnknown的功能,
IControl表示控件的基本接口, 所有控件都從該接口繼承,
IControlContainer表示容器類控件的基本接口,
IButton表示Button類的基本接口,
IPanel表示某種容器控件接口。
 
當(dāng)然上面的框架是簡(jiǎn)化的情況,實(shí)際情況比上面的復(fù)雜的多, 但該圖已經(jīng)可以幫我們說(shuō)明這里的情況。

在真正實(shí)現(xiàn)Panel和Button時(shí),我們會(huì)發(fā)現(xiàn)大量的代碼是重復(fù)和可以共用的,因此在實(shí)際實(shí)現(xiàn)時(shí), 我們的框架可能會(huì)變成這樣:

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

那么我們?cè)鯓硬拍芗然诮涌诰幊蹋?又能在實(shí)現(xiàn)時(shí)實(shí)現(xiàn)代碼重用呢? 這個(gè)東西實(shí)際上是個(gè)語(yǔ)法糖, 即如何既符合C++語(yǔ)法又能實(shí)現(xiàn)我們這個(gè)需求。

于是,我們想到了如下的實(shí)現(xiàn)方式: 

我們的這種實(shí)現(xiàn)方式基于C++模板, 總的來(lái)說(shuō)就是把我們要實(shí)現(xiàn)的接口通過(guò)模板參數(shù)傳到繼承類體系的最底層, 該方式的代碼大概如下:
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>
{
};

該方式基本上完全滿足我們上面的需求,既實(shí)現(xiàn)了代碼重用,又是基于接口編程,但是你有沒(méi)有發(fā)現(xiàn)它有一個(gè)致命的缺點(diǎn), 這個(gè)缺點(diǎn)就是C++模板導(dǎo)致的代碼膨脹, 我們?cè)?nbsp;C++模板會(huì)使代碼膨脹嗎 對(duì)模板導(dǎo)致的代碼膨脹有相關(guān)分析。也就是說(shuō)我們上面的設(shè)計(jì)會(huì)導(dǎo)致每種控件繼承類都有一份重復(fù)的代碼, 即CControlImpl<IButton>和CControlImpl<IPanel>因?yàn)槭遣煌念悓?shí)例, 因此它們會(huì)生成2分代碼。你可能會(huì)覺(jué)得這個(gè)不算什么, 但是想想控件的繼承類可能有好幾十甚至上百,最終的可執(zhí)行文件會(huì)被撐大不少。

那么有沒(méi)有其他的方法來(lái)實(shí)現(xiàn)呢?  既能基于接口編程, 又能實(shí)現(xiàn)代碼重用,還沒(méi)有代碼膨脹的問(wèn)題。

于是,我們想到了下面這種實(shí)現(xiàn)方式:




這種方式是最原始的方式, 實(shí)際上就是把接口體系單獨(dú)獨(dú)立出來(lái), 把實(shí)現(xiàn)體系也單獨(dú)獨(dú)立出來(lái),  然后在最終類(Button和Panel)里繼承組合起來(lái)。 當(dāng)然這種方式也有缺點(diǎn), 就是我們要多做些工作,因?yàn)槲覀円谧罱K類(Button)里實(shí)現(xiàn)接口(IButton), 在實(shí)現(xiàn)時(shí)我們要把所有接口需要實(shí)現(xiàn)的方法轉(zhuǎn)發(fā)給實(shí)現(xiàn)類(CButtonImpl)。

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

我暫時(shí)就想到這些方法, 不知道其他朋友對(duì)上面的問(wèn)題一般是怎么解決的, 有什么好的解決方法?

下面這種方案是評(píng)論中的朋友提到而新增的: 

上面這種方案相對(duì)于我們最后一種解決方案,可能更通用,缺點(diǎn)是繼承體系比較復(fù)雜, 會(huì)出現(xiàn)菱形繼承,只能用虛擬繼承。

注: 再深入一點(diǎn),我們會(huì)發(fā)現(xiàn)上面的接口和實(shí)現(xiàn)其實(shí)是接口和抽象類的差別,IObject和IControl是接口, CObjectImpl和CControlImpl是抽象類, 接口強(qiáng)調(diào)暴露給外部的行為, 而抽象類是沒(méi)法直接實(shí)例化的抽象實(shí)現(xiàn)。


看到云風(fēng)也遇到過(guò)類似的問(wèn)題: C++ 中的接口繼承與實(shí)現(xiàn)繼承
posted on 2013-02-08 19:40 Richard Wei 閱讀(2581) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 架構(gòu)體系

FeedBack:
# re: 接口繼承中一個(gè)常見(jiàn)問(wèn)題的思考[未登錄](méi)
2013-02-20 17:40 | korall
我也遇見(jiàn)過(guò)類似的情況,為了重用接口的實(shí)現(xiàn),后來(lái)我將接口設(shè)計(jì)成分離的、互不依賴的形式。

不過(guò)像這樣的設(shè)計(jì)好像更普遍:
struct IBase
{
};

struct IA : virtual public IBase
{
};

struct IB : virtual public IA
{
};

class IBaseImpl : virtual public IBase
{
};

class IAImpl : public IBaseImpl,virtual public IA
{
};

class IBImpl : public IAImpl,virtual public IB
{
};

class C : public IBImpl
{};
  回復(fù)  更多評(píng)論
  
# re: 接口繼承中一個(gè)常見(jiàn)問(wèn)題的思考
2013-02-20 20:57 | Richard Wei
@korall
不錯(cuò) ,這種可能更通用, 雖然我一直沒(méi)用。
已在文章后面加上你提的方案。:)  回復(fù)  更多評(píng)論
  
# re: 接口繼承中一個(gè)常見(jiàn)問(wèn)題的思考[未登錄](méi)
2013-02-27 18:20 | 路人甲
對(duì)外暴露的接口如何讓外部訪問(wèn)屬性...
當(dāng)一個(gè)接口的屬性比較多的時(shí)候,比如有10個(gè)屬性,是不是得提供20個(gè)方法...
int GetValue1();
void SetValue1(int nValue):

...

int GetValue10();
void SetValue10(int nValue):  回復(fù)  更多評(píng)論
  
# re: 接口繼承中一個(gè)常見(jiàn)問(wèn)題的思考
2013-02-27 19:01 | Richard Wei
@路人甲
是的, C#語(yǔ)言本身支持property, C++中只能通過(guò)Get,Set函數(shù)了, COM也是這么做的。  回復(fù)  更多評(píng)論
  
# re: 接口繼承中一個(gè)常見(jiàn)問(wèn)題的思考
2013-03-12 13:27 | 墮花月
我原來(lái)設(shè)計(jì)過(guò)一個(gè)DUI,就是一切控件皆容器,按鈕如果也是容器的話能做很多事情  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久成人一区| 欧美超级免费视 在线| 国产美女诱惑一区二区| 欧美色图首页| 国产精品久久久久一区二区三区共 | 美女福利精品视频| 裸体丰满少妇做受久久99精品| 久久精品卡一| 蜜桃av综合| 亚洲精品久久久久久久久久久| 欧美大成色www永久网站婷| 欧美激情第三页| 一区二区av在线| 久久国产精品99国产| 牛牛影视久久网| 欧美日韩一级片在线观看| 国产精品日韩在线| 伊人久久大香线| 日韩小视频在线观看| 午夜在线a亚洲v天堂网2018| 老牛国产精品一区的观看方式| 亚洲国产你懂的| 翔田千里一区二区| 欧美大胆人体视频| 国产嫩草影院久久久久| 亚洲高清激情| 性18欧美另类| 亚洲国产精品一区| 亚洲欧美日韩视频一区| 欧美黄色影院| 在线电影一区| 久久精选视频| 国产精品高清在线| 国产一区二区三区在线观看视频| 亚洲国产乱码最新视频| 欧美一级久久久| 亚洲精品美女在线| 久久精品一本| 国产精品日日摸夜夜添夜夜av| 亚洲第一视频网站| 久久精品动漫| 国产精品99久久久久久久vr| 久久夜色精品亚洲噜噜国产mv| 国产精品国产三级国产| 亚洲精品美女久久久久| 久久婷婷激情| 午夜亚洲伦理| 国产女人水真多18毛片18精品视频| 亚洲黄色影院| 免费亚洲视频| 久久久久国产精品午夜一区| 国产欧美丝祙| 欧美在线精品一区| 亚洲一区二区欧美日韩| 欧美日韩精品免费看| 亚洲精品综合久久中文字幕| 欧美jizz19性欧美| 久久久噜噜噜久久| 在线精品一区二区| 黑人操亚洲美女惩罚| 亚洲欧美国产日韩中文字幕| 亚洲精品日产精品乱码不卡| 欧美福利电影网| 91久久极品少妇xxxxⅹ软件| 欧美3dxxxxhd| 欧美韩日一区二区| 99xxxx成人网| 亚洲手机视频| 国产丝袜一区二区| 久久夜色精品| 欧美v日韩v国产v| 日韩亚洲在线| 亚洲视频每日更新| 国产精品影视天天线| 久久国产精品网站| 久久久久高清| 亚洲免费黄色| 亚洲一区视频在线| 国产一区二区视频在线观看| 麻豆成人91精品二区三区| 裸体丰满少妇做受久久99精品| 欧美日韩国产精品专区| 一区二区高清在线| 一区二区三区欧美在线观看| 欧美视频日韩视频| 欧美一级理论片| 久久久精品久久久久| 日韩午夜剧场| 性欧美暴力猛交另类hd| 亚洲国产日日夜夜| 亚洲性感激情| 亚洲国产精品999| 99在线观看免费视频精品观看| 国产欧美日韩一区二区三区在线观看 | 中日韩视频在线观看| 亚洲午夜女主播在线直播| 韩国女主播一区| 亚洲激情二区| 国产精品自拍一区| 欧美第一黄网免费网站| 国产精品videosex极品| 麻豆精品传媒视频| 欧美日韩在线高清| 蜜乳av另类精品一区二区| 欧美日韩一区二区三区四区在线观看 | 亚洲高清不卡| 国产亚洲一区二区在线观看| 亚洲国产日韩一区| 国产午夜精品在线观看| 亚洲美女精品久久| 尤物yw午夜国产精品视频明星| 一区二区三区四区五区视频 | 久久久一二三| 国产日韩视频一区二区三区| 欧美激情一二区| 狠狠综合久久| 亚洲欧美国产高清| 一区二区成人精品| 另类成人小视频在线| 久久久www免费人成黑人精品| 欧美片在线播放| 欧美激情四色 | 久久久国产成人精品| 欧美日韩你懂的| 亚洲国产精品第一区二区| 国语自产精品视频在线看8查询8| 一区二区三区视频在线| 这里只有精品丝袜| 欧美日韩大片| 91久久精品国产91久久| 亚洲人成网站影音先锋播放| 久久久免费精品视频| 久久久久久久久久久久久9999| 欧美性猛交xxxx免费看久久久 | 欧美精品福利| 欧美xx视频| 91久久午夜| 美女爽到呻吟久久久久| 久久天天躁狠狠躁夜夜av| 国产欧美一区在线| 午夜精品福利一区二区三区av| 午夜精品久久久久久久久久久久久| 欧美日韩亚洲三区| 夜夜嗨av一区二区三区四季av| 一区二区三区精密机械公司 | 久久久精品欧美丰满| 久久精品亚洲热| 国产亚洲精品bt天堂精选| 午夜一区二区三视频在线观看| 欧美一级理论性理论a| 国产午夜精品全部视频播放| 久久国内精品视频| 欧美高清日韩| 在线亚洲观看| 国产精品激情| 欧美亚洲一区二区在线观看| 久久久久久久久久久久久女国产乱 | 国产在线拍偷自揄拍精品| 久久精品观看| 欧美激情一级片一区二区| 99亚洲一区二区| 国产美女精品视频| 麻豆久久精品| 一本大道av伊人久久综合| 国产在线视频欧美一区二区三区| 欧美在线日韩| 91久久久久久国产精品| 午夜精品av| 黑人操亚洲美女惩罚| 欧美精品一区二区三| 亚洲一区在线观看视频| 久久天天躁狠狠躁夜夜av| 99视频精品全国免费| 国产视频久久网| 欧美激情一区二区三区四区| 亚洲欧美国产不卡| 亚洲第一页在线| 午夜伦理片一区| 亚洲日韩欧美视频| 国产精自产拍久久久久久蜜| 久久综合色8888| 亚洲一区中文字幕在线观看| 美女主播精品视频一二三四| 亚洲一区二区黄| 亚洲日韩欧美视频一区| 国产日韩欧美亚洲一区| 欧美日本二区| 久久亚洲色图| 午夜精品久久久久99热蜜桃导演| 亚洲成人资源| 国产有码一区二区| 欧美精品一区二区精品网 | 欧美一级免费视频| 日韩视频一区二区在线观看| 久久免费99精品久久久久久| 亚洲一区二区免费| 亚洲人成啪啪网站| 伊人久久婷婷色综合98网| 国产精品一区毛片| 欧美日本不卡高清|