• <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>

            deepway

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              1 Posts :: 9 Stories :: 1 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            • 1.?re: 軟件運(yùn)行日志[未登錄]
            • 我覺得調(diào)試日志不應(yīng)該只記錄軟件的非正常過程吧,而是記錄軟件的運(yùn)行過程。期間有不正常的時(shí)候用warning,error和fetal來記錄。
            • --hi


            問題描述:
               在 C++ 面向?qū)ο缶幊讨校3龅?#8220;類型識別”的需求:已知某個(gè)對象的基類型指針,需要識別該對象的派生類型,訪問派生類型的公有函數(shù)。簡單說就是,將基類型指針轉(zhuǎn)換為派生類型指針,并用來訪問派生類型的公有函數(shù)。

            問題分析: 
               “類型識別”本質(zhì)上是一個(gè)從抽象轉(zhuǎn)為具象的過程,破壞了對象抽象性。雖不值得提倡,但在具象化情景下,“類型識別”又是必須的。
               “類型識別”常規(guī)方法是強(qiáng)制類型轉(zhuǎn)換。這需要先定義一個(gè)“對象類型”枚舉表,再在基類里定義一個(gè)返回“對象類型”的函數(shù)。這種方法的缺點(diǎn)顯而易見:
                     1. 需要維護(hù)全局性的“對象類型”枚舉表;
                     2. 向基類型構(gòu)造函數(shù)傳入“對象類型”參數(shù);
                     3. 每次“類型轉(zhuǎn)換”前,先要獲得“對象類型”值,判斷對象類型;
               “類型識別”的另一種標(biāo)準(zhǔn)方法是RTTI。作為一項(xiàng) C++ 編譯選項(xiàng),RTTI 直接將上述常規(guī)方法教給編譯器做了。然而,這樣也是有缺點(diǎn)的:
                     1. RTTI會引入額外的開銷。這是可以理解的,問題是RTTI這種開銷會附加到所有類型上去;
                     2. RTTI要求所有庫都以RTTI方式編譯,才能正常工作。而現(xiàn)實(shí)世界總是復(fù)雜的,這一點(diǎn)未必總是能實(shí)現(xiàn);
                     3. 個(gè)人認(rèn)為RTTI是一種過于形式化的東西,違反了 C++ 的簡潔性、高效性原則;
                     4. 個(gè)人認(rèn)為RTTI的低層形式化的東西,很多時(shí)候,我們?nèi)匀恍枰x不依賴于C++類的“對象類型”枚舉表;
               閱讀 WebKit 代碼時(shí),我看到了一種基于虛函數(shù)的“類型識別”方法,代碼如下:
               class EventTarget {
               public:
                    void ref() { refEventTarget(); }
                    void deref() { derefEventTarget(); }

                    virtual EventSource* toEventSource();
                    virtual MessagePort* toMessagePort();
                    virtual Node* toNode();
                    virtual DOMWindow* toDOMWindow();
                    virtual XMLHttpRequest* toXMLHttpRequest();
                    virtual XMLHttpRequestUpload* toXMLHttpRequestUpload();

             在基類中,定義向派生類型的轉(zhuǎn)換函數(shù),并且返回為NULL。每個(gè)派生類型,重新實(shí)現(xiàn)向自身轉(zhuǎn)換的轉(zhuǎn)換函數(shù),返回自身的指針。我感覺這種方法:
                     1. 非常安全,使用方便;
                     2. 效率相對比較高;
                     3. 省卻了全局性的“對象類型”枚舉表,卻帶來了維護(hù)基類“轉(zhuǎn)換函數(shù)”的負(fù)擔(dān);
                     4. 造成了基類對派生類的依賴性,似乎不太好。

               在上述方法的基礎(chǔ)上,設(shè)想了一種改進(jìn)的方法,設(shè)計(jì)原則是“從基類型向派生類型轉(zhuǎn)換的函數(shù),應(yīng)該放置在派生類中,以靜態(tài)函數(shù)的方式定義”。具體方法如下:
                     1. 基類定義 void* toXXXX() 和 bool isXXXX() 兩個(gè)私有虛函數(shù),用編程規(guī)范規(guī)定,禁止派生類直接訪問它們。
                     2. 派生類重定義上述函數(shù)。
                     3. 派生類型定義 XXXX* toType(Base*) 和 bool isType(Base*)兩個(gè)靜態(tài)函數(shù),內(nèi)部實(shí)現(xiàn)就是通過上述私有虛函數(shù)完成的。
                     4. 所有的“類型識別操作”都使用上述靜態(tài)函數(shù)完成。

            問題小結(jié):
                     上述四種方式,很難說哪一種方式更好,宜具體情況具體對待。
                      我本人偏向于,使用最后一種方式作為C++編程規(guī)范和模式,因?yàn)椋且环N接口規(guī)范,其內(nèi)部實(shí)現(xiàn)可以改為前三種方法中的任何一種。至于它帶來的些許工作量,我認(rèn)為,在它成為一種工作規(guī)范后,那些少量代碼僅僅只是一點(diǎn)點(diǎn)沒有難度的機(jī)械性編程,完全可以忽略不計(jì)。如果不介意在代碼中使用宏機(jī)制,那么更可以用宏來實(shí)現(xiàn),那么只需定義編譯宏就能就在三種方式之間任意切換。
                     最后一種方式,體現(xiàn)了一種策略:當(dāng)你想為基類定義一些與派生類相關(guān)的工具函數(shù)時(shí),倒不如將其定義為派生類的靜態(tài)函數(shù),以避免派生類型對基類型的“污染”。

            posted on 2010-06-28 20:21 maxime 閱讀(623) 評論(0)  編輯 收藏 引用 所屬分類: C++ 設(shè)計(jì)模式

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲国产成人久久一区WWW| 久久精品国产一区| 无码任你躁久久久久久老妇App| 日韩va亚洲va欧美va久久| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久只这里是精品66| 97视频久久久| 中文字幕亚洲综合久久2| 欧美久久久久久| 亚洲国产成人久久精品动漫| 亚洲精品无码专区久久同性男| 男女久久久国产一区二区三区| 国产精品嫩草影院久久| 中文无码久久精品| 久久综合九色欧美综合狠狠 | 狠狠狠色丁香婷婷综合久久俺| 无码任你躁久久久久久| 99久久国产综合精品麻豆| 久久久午夜精品| 久久五月精品中文字幕| 7国产欧美日韩综合天堂中文久久久久| 天堂无码久久综合东京热| 久久国产精品一区二区| 日韩人妻无码一区二区三区久久| 少妇久久久久久被弄到高潮 | 亚洲精品97久久中文字幕无码| 久久福利青草精品资源站免费| 亚洲国产精品无码久久98| 一本大道久久香蕉成人网| 久久久久99精品成人片牛牛影视| 精品久久久久久亚洲精品| 伊人久久综合无码成人网| 日本高清无卡码一区二区久久| 日韩亚洲欧美久久久www综合网 | 72种姿势欧美久久久久大黄蕉| 亚洲人成无码网站久久99热国产 | 国产精品久久久久久一区二区三区| 伊人久久一区二区三区无码| 欧美日韩精品久久久久| 亚洲国产精品成人AV无码久久综合影院| 国产精品久久午夜夜伦鲁鲁|