[英]C++: design advice
我需要一些有關類層次結構設計的建議。 我當前設計的“骨架”是
template <class X>
class BASE {
public:
virtual void f() {
x_.f2(m_);
}
void g() {
/* do stuff here*/
x_.g();
}
/* more member functions here*/
protected:
X x_;
int m_;
};
template <class X>
class DERIVED : BASE<X> {
public:
virtual f() override {
x_.f1();
}
protected:
using BASE<X>::x_;
using BASE<X>::m_;
};
最后我又有兩個這樣的課程
struct X1 {
void f1();
void g();
};
struct X2 : X1 {
void f2(int m);
};
我希望能夠創建DERIVED<X1>
的實例。 為此,編譯器將首先創建BASE<X1>
的實例,在這種情況下,它將抱怨X1沒有成員函數f2(盡管實際上它永遠不會被調用,因為調用函數f()是虛擬)。
我知道這是一個糟糕的設計,因為要擁有模板化的類,模板參數必須具有相同的接口。 在我的情況下,X1和X2具有公共接口,但是X2具有更多功能,從而產生了上述問題。 我知道我可以在X1中創建一個不執行任何操作的f2函數,但理想情況下,我希望避免這種情況。
我歡迎任何改進設計的建議。 提前致謝!
首要建議是不要使用受保護的屬性。 正在打破封裝。
第二種建議是使virtual void f()=0
完全不執行而成為純虛virtual void f()=0
。 這樣,派生類就不會有錯誤。
避免派生出具體的類。 將接口/ ABC提升到頂部,使所有具體類都離開。 這是針對許多設計難題的一般建議。
在您的特定情況下,請執行以下操作:
BASE // concrete
|
DERIVED
用這個:
BASE // fully abstract
/ \
BASIC_DERIVED ADVANCED_DERIVED
現在f
在BASE
是純虛擬的,一切都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.