C++的多继承很难理解,可是如果单继承又觉得以后无法扩展功能,object-c有protocol,C++没有。
那如何扩展类的功能呢?
谢谢!
人生最曼妙的风景,竟是内心的淡定与从容!
C++要想實作protocol或java的interface,除了多繼承沒有它路了…怕衝突可以使用虛繼承。 列出兩種不怎麼可行的做法:
一種是使用組合而非繼承。 把想實現的一組功能定義為一個類別A,然後把這個類別A當作一個目標類別B的一個成員。再給類別B寫出一組public方法,這些方法將透過轉調類別A的方法來實現功能。 但是這樣做實作不了像interface那樣的功能。原因很明顯,類A和類B不位於同一個類體系中。
第二種是使用模板。 如果某個類別實作了一組想要的功能,我們就可以給這個類別提供一個tag。如果有一個函數需要使用這一組功能,那麼我們可以檢查給的模板參數中是否有這麼一個tag,如果沒有這麼一個tag,程式將不能通過編譯。 但是這樣比較複雜,真的決定要這麼做麼?
其實,如果不要求實作成protocol,可以考慮使用工廠函數/物件。即提供一組參數作為函數/方法的參數,生成基底類別相同,但是對基底類別方法的實作有差異的一組子類別。這樣就能使用基底類別指標呼叫它們的方法。
java類別實作介面的語意,就是c++裡的虛繼承,目的就是為了避免菱形繼承的二義性問題。
C++中的設計模式對於你的這種擴展一般使用繼承+組合來實現; 你可以考慮先使用一個抽象類別Abstraction,用業務類別RefinedAbstraction繼承它; 然後,根據你的需要,將你需要進行功能擴展的介面以組合的形式(一般定義為指標)放到你的抽象類別或業務類別中: Implementor:實作類別介面 ConcreteImplementor:具體實作類別
參考《圖說設計模式》中橋接模式的這張圖你就明白了:
詳情請見:http://design-patterns.readthedocs.org/zh_CN/latest/structural_patterns/bridge.html
盡量多用組合,少用繼承,java,objC和C++都是
少用繼承,多用 std::function / std::bing / lambda
C++要想實作protocol或java的interface,除了多繼承沒有它路了…怕衝突可以使用虛繼承。
列出兩種不怎麼可行的做法:
一種是使用組合而非繼承。
把想實現的一組功能定義為一個類別A,然後把這個類別A當作一個目標類別B的一個成員。再給類別B寫出一組public方法,這些方法將透過轉調類別A的方法來實現功能。
但是這樣做實作不了像interface那樣的功能。原因很明顯,類A和類B不位於同一個類體系中。
第二種是使用模板。
如果某個類別實作了一組想要的功能,我們就可以給這個類別提供一個tag。如果有一個函數需要使用這一組功能,那麼我們可以檢查給的模板參數中是否有這麼一個tag,如果沒有這麼一個tag,程式將不能通過編譯。
但是這樣比較複雜,真的決定要這麼做麼?
其實,如果不要求實作成protocol,可以考慮使用工廠函數/物件。即提供一組參數作為函數/方法的參數,生成基底類別相同,但是對基底類別方法的實作有差異的一組子類別。這樣就能使用基底類別指標呼叫它們的方法。
java類別實作介面的語意,就是c++裡的虛繼承,目的就是為了避免菱形繼承的二義性問題。
C++中的設計模式對於你的這種擴展一般使用繼承+組合來實現;
你可以考慮先使用一個抽象類別Abstraction,用業務類別RefinedAbstraction繼承它;
然後,根據你的需要,將你需要進行功能擴展的介面以組合的形式(一般定義為指標)放到你的抽象類別或業務類別中:
Implementor:實作類別介面
ConcreteImplementor:具體實作類別
參考《圖說設計模式》中橋接模式的這張圖你就明白了:
詳情請見:
http://design-patterns.readthedocs.org/zh_CN/latest/structural_patterns/bridge.html
盡量多用組合,少用繼承,java,objC和C++都是
少用繼承,多用 std::function / std::bing / lambda