【发布时间】:2015-12-07 02:14:33
【问题描述】:
例如,我有一些 Shape,每个 shape 返回不同类型的按钮:
#include <stdio.h>
struct Button{
Button(){
printf("Button\n");
}
};
struct CircleButton : public Button{
CircleButton(){
printf("CircleButton\n");
}
};
struct SquareButton : public Button{
SquareButton(){
printf("SquareButton\n");
}
};
struct Shape{
virtual Button* getNewButton()=0;
};
struct Circle : public Shape{
Button* getNewButton(){
return new CircleButton();
}
};
struct Square : public Shape{
Button* getNewButton(){
return new CircleButton();
}
};
通过使用覆盖,我可以编写一些通用代码:
int main(){
Shape* s=new Circle();
Button* b=s->getNewButton();
return 0;
}
但现在shape是数据传输对象,它不应该有任何方法:
struct Shape{
};
struct Circle : public Shape{
};
struct Square : public Shape{
};
我想保留我的通用代码,我试过了:
struct Helper{
static Button* getNewButton(Shape* s){
return new Button();
}
static Button* getNewButton(Circle* s){
return new CircleButton();
}
static Button* getNewButton(Square* s){
return new SquareButton();
}
};
int main(){
Shape* s=new Circle();
Button* b=Helper::getNewButton(s);
return 0;
}
但是这次我不能得到一个新的CircleButton,如何修改代码,或者可以应用什么设计模式,这样我可以根据不同的形状得到不同类型的按钮,但是没有实现Shape,Circle和中的任何方法正方形?
【问题讨论】:
-
一个除了简单地返回另一个类的新实例什么都不做的类有什么意义?它们可能只是独立的功能。
-
您可以查看使用
Vistor Pattern。 -
为什么?您对重写虚函数有何反感?
-
对没有虚拟或不虚拟方法的数据传输对象使用继承有什么意义?如果 Circle 没有任何行为,为什么还要继承 Shape?
标签: c++ oop design-patterns overriding generic-programming