我正在爲我的項目設計一個接口,並好奇這個想法是否可以實現。 這裏是情況, 在運行時,我想使用一個基類指針數組來發出命令給不同的派生對象。不同的派生對象有不同的實現(虛函數)。我的問題是:如果這些對象獲得了不同的接口支持級別,我該如何避免寫一個空函數?設計模式:部分支持派生類的統一接口
例如,(我當前的代碼)
Class Base { //this is the main interface
public:
virtual void basicFun() = 0;
virtual void funA(int input1) {return;}
virtual void funB(int input2) {return;}
virtual void funC(int input3) {return;}
}
Class Derived1 : public Base { //this class support only funA()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
}
Class Derived2 : public Base { //this class support both funA() funB()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
}
Class Derived3 : public Base { //this class support all
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
void funC(int input3) {//do something}
}
假設:對於某個對象,不支持的功能將永遠不會被調用。即如果basePtr指向的對象是Derived1或Derived2,則不會調用BasePtr-> funC()。 問題是:
- 我必須要麼在基地限定一個空的功能,或者如果一個統一的接口期望
- 如果空白函數像上面定義的派生,編譯器保持警告我未引用的參數(輸入1〜輸入3) 。當然,我可以關閉它,但只是不喜歡這種方式。
那麼,有沒有什麼模式可以用來實現統一接口而不需要定義空函數?我一直在想這個幾天。這似乎不可能。因爲funA()funB()和funC()必須在接口中,所以我可以使用Base指針數組來控制所有對象,這意味着在Derived1中,必須以某種方式定義funB()和funC()。
非常感謝,感謝您分享您的想法。
Solti
嗨,謝謝你的回覆。我可以理解沒有Brake()的汽車是什麼意思。但是,如果我們正在開發某種OEM軟件,則可能需要使用相同的庫級代碼,但使用不同的AP級代碼。所以我希望保持接口不變,只修改AP中的一些代碼。所以,對於一些客戶,我想給他們一輛沒有Brake()的汽車。並且保證car-> Brake()從不需要。 (也許客戶端正在做崩潰測試)其次,我嘗試了參數名稱省略技巧,它的工作原理!非常感謝! – Solti 2010-11-22 20:08:43