抽象ファクトリパターンを念頭に置いて、具体的なファクトリがcreateButton * s *仮想メソッドをオーバーライドし、より幅広いボタンの配列を返す必要があるクラス階層があると想像してください。C ++は共変の戻り型のみをサポートするため、これを解決するための洗練された回避策は何でしょうか。dynamic_cast?
私の要件に合うようにGoFの例を修正したもの:
class Button {
public:
virtual void paint() = 0;
virtual ~Button(){
}
};
class WinButton: public Button {
public:
void paint() {
cout << "I'm a WinButton";
}
};
class OSXButton: public Button {
public:
void paint() {
cout << "I'm an OSXButton";
}
};
class GUIFactory {
public:
virtual Button * createButtons() = 0;
virtual ~GUIFactory(){
}
};
class WinFactory: public GUIFactory {
public:
WinButton* createButtons() {
return new WinButton[2];
}
~WinFactory(){
}
};
class OSXFactory: public GUIFactory {
public:
OSXButton* createButtons() {
return new OSXButton[2];
}
~OSXFactory(){
}
};
そして、アプリケーションのスケルトン:
Application(GUIFactory * factory) {
Button* buttons = factory->createButtons();
for(...) {...}
}