我已經構建了幾個類(A
,B
,C
...),它們在同一個BaseClass
上執行操作。例如:如何給C++類(接口)提供屬性
struct BaseClass {
int method1();
int method2();
int method3();
}
struct A { int methodA(BaseClass& bc) { return bc.method1(); } }
struct B { int methodB(BaseClass& bc) { return bc.method2()+bc.method1(); } }
struct C { int methodC(BaseClass& bc) { return bc.method3()+bc.method2(); } }
但你可以看到,每個班A
,B
,C
...只有使用的BaseClass
的可用方法的子集,我想給BaseClass
分成幾個塊,使得很清楚它使用了什麼,什麼不是。例如,一個解決方案是使用多重繼承:
// A uses only method1()
struct InterfaceA { virtual int method1() = 0; }
struct A { int methodA(InterfaceA&); }
// B uses method1() and method2()
struct InterfaceB { virtual int method1() = 0; virtual int method2() = 0; }
struct B { int methodB(InterfaceB&); }
// C uses method2() and method3()
struct InterfaceC { virtual int method2() = 0; virtual int method3() = 0; }
struct C { int methodC(InterfaceC&); }
的問題是,我每增加一個新類型的操作時間,我需要改變的BaseClass
實施。例如:
// D uses method1() and method3()
struct InterfaceD { virtual int method1() = 0; virtual int method3() = 0; }
struct D { int methodD(InterfaceD&); }
struct BaseClass : public InterfaceA, public InterfaceB, public InterfaceC
// here I need to modify the existing code to add class D
{ ... }
你知道一個乾淨的方式,我可以做到這一點嗎?
感謝您的幫助
編輯:
我忘了提及,它也可以使用模板來完成。但是我不喜歡這個解決方案,因爲所需的接口沒有在代碼中明確顯示。您必須嘗試編譯代碼以驗證所有必需的方法是否正確實施。另外,它需要實例化不同版本的類(每個BaseClass類型模板參數一個),這並非總是可能,也不是期望的。
這正是我需要的!謝謝 – caas 2010-05-31 19:20:53