2010-04-21 186 views
2

我想獲得關於以下三種設計模式的stackoverflow社區的意見。首先是實現繼承;第二個是接口繼承;第三個是中間地帶。我的具體問題是:哪個最好?實現/接口繼承設計問題

實現繼承:

class Base { 
    X x() const = 0; 
    void UpdateX(A a) { y_ = g(a); } 
    Y y_; 
} 

class Derived: Base { 
    X x() const { return f(y_); } 
} 

接口繼承:

class Base { 
    X x() const = 0; 
    void UpdateX(A a) = 0; 
} 

class Derived: Base { 
    X x() const { return x_; } 
    void UpdateX(A a) { x_ = f(g(a)); } 
    X x_; 
} 

中間地帶:

class Base { 
    X x() const { return x_; } 
    void UpdateX(A a) = 0; 
    X x_; 
} 

class Derived: Base { 
    void UpdateX(A a) { x_ = f(g(a)); } 
} 

我知道很多人喜歡接口繼承實現繼承。然而,後者的優點是,通過指向Base的指針,可以內聯x(),並且可以靜態計算x_的地址。

回答

0

我會說沒有任何一項技術比其他技術本身更好更好。根據使用環境的不同,它們都適用於不同的場景。

如果您正在實施Composite Pattern並且大多數類將使用相同的實現,那麼實現繼承可能是一條可行的路。它將允許您改進那些需要它的類的實現,同時爲那些不需要的類共享代碼。

如果您正在實施Visitor Pattern,其中每個類的方法實現可能完全不同,那麼接口繼承可能最有意義。在這種情況下,基類實現可能只能由單個類使用。

如果您繼承的項目不是使用面向對象技術設計的,那麼我可以看到您的中間示例很有用。也許你需要在添加新功能的同時重構它,並且可以使用它作爲獲取遺留代碼與使用面向對象設計的新代碼交互的方式。這是比實際的「最佳實踐」更妥協的做法,但我們都必須讓它們運送產品......如果我能想到一個更好/更具體的例子,我會發布它。

0

如果有多個派生類,所有派生類在輸入上使用g(a)轉換,那麼我會選擇第一個選項,以避免重複代碼。我認爲這是一個比優化元素尋址更高的目標。