2009年12月16日 星期三

Composite VS Private Inheritance


這兩天和阿伯討論Composite VS Private Inheritance
事實上這是effective C++的item38 和 39
都是在論述"is-implement-in-terms-of"
相信大家都懂composite得用途
當你需要他的一些特性,但你不是他,得要客製化他的behavior就可以使用composite


書上提到 Private Inheritance 不是一個"is a"的關係 而用途和composite也很像
差別在於 當有protected members 和 virtual function的時候使用Private Inheritance會更好
反之一般的時候Composite會是主流的寫法


簡單的example:
class 丐幫幫主{
public:
void 打狗棒法();
void 降龍18掌(){
18掌都會;
}
protected:
void 幹掉帶頭大哥();
}
以下是composite 和 private inheritance的差別


private inheritance:
class 陳欠欠:private 丐幫幫主{ //陳欠欠是丐幫幫主,但沒人知道
public:
void 降龍18掌(){
只會17掌;
}
void 我生氣惹(){
幹掉帶頭大哥(); //call的到,因為繼承自丐幫幫主
}
}
陳欠欠.降龍18掌; //call 的到,只會17掌
陳欠欠.打狗棒法; //call不到,沒人知道他會
composite:
class 陳欠欠{
public:
void 降龍18掌(){
只會17掌;
}
void 我生氣惹{
主任->幹掉帶頭大哥; //call不到惹
}

private:
丐幫幫主 *主任;
}


陳欠欠.降龍18掌; //只會17掌
--
以上就是composite 和 private Inheritance的差別
都可以客製化"降龍十八掌"來告訴大家其實欠欠只會17掌
但使用private Inheritance的欠欠生氣惹可以幹掉帶頭大哥
使用composite的欠欠不能
我想這是因為protected的特性吧!!


//例子有點亂 : p 不懂我再生另外一個中規中矩的XD


virtual function Example也差不多
你必須要private Inheritance 才可以去重新定義virtual function
composite則做不到


以上是我的理解 歡迎大家討論~

5 則留言:

  1. 個人的想法, 覺得用 composite, 陳欠欠本來就不是丐幫幫主, 不能用丐幫幫主的身分幹掉帶頭大哥, 其實也蠻合理的說~ XD

    回覆刪除
  2. 丐幫幫主 *主任; XD
    有趣~小歪開這主題前的問題也很有趣"如果今天要實作一個只能insert更大或不能insert重複的linking list...?",composite跟private inheritance 共有的一個特性是 朕不給的你不能搶 ! (誤) 是base class的功能被保護得很好,不會被亂用。(有開出來相對應用到base class的public function 才有機會call到)。透過這個例子我才更了解composite跟Private Inheritance。推一個

    回覆刪除
  3. 再翻了一下 private inheritance 的定義, 反而對這兩個的使用時機更加模糊了~ 囧rz

    回覆刪除
  4. 自問自答....

    Private Inheritance 代表的意義是 "is-implemented-in-terms of", 跟 Composite 的其中一種行為一樣. 如同小歪提到的, Private Inheritance 提供了讓其他人修改你的 implementation 的機會. (through virtue function and protected member.).

    這在 composite 的設計裡面, 是可以做到的, 但是代價就是得付出更多的 Space. (ex: subclass 丐幫幫主, 然後 composite 的物件實際上是 new subclass of 丐幫幫主). 而且也可以減少 compilation dependency. ( 擁有的是 subclass of 丐幫幫主, 改丐幫幫主, 不需要 compile 陳欠欠.)

    因為 Composite 是比較容易了解的 design, 沒有特殊需求, 用 Composite 是一件比較不易犯錯的選擇.

    然而, 像有些 Library Designer, 會去追求最小化空間使用 (Empty Base Optimization), 用 Private Inheritance 會是一個合理的選擇方式, 如果用 Composite, 即使有的是一個 Empty class, 至少還是會塞進一個 char ( Platform Dependent), 然後再經過 Alignment + Padding. 他就變大了....

    資料來源: Effective C++: Item 38, 39

    回覆刪除
  5. 有心~ 目前聽到private inheritance唯一有牛肉味的優勢~

    回覆刪除