以下面简化的C++类层次结构为例。我想要完成的是Service
提供了一种虚拟方法来保存任意的对象。但是Service
的每个子类,例如BoxService
应该只能保存Box
个对象。C++协变参数 - 设计模式
由于这样的事实:C++不支持方法参数的协方差,我不能简单地声明的保存方法BoxService.h
,如:
void save(Box box);
我的问题是,有没有什么最佳设计模式或最佳实践为问题?或者,如果到达的Model对象是Box类型,并且在其他情况下抛出异常,我应该检查BoxService.cpp
中的保存函数的实现吗?
Model.h
class Model {
private:
int id;
};
Box.h
class Box : public Model {
private:
int size;
};
Service.h
class Service {
public:
virtual void save(Model model);
};
BoxSe rvice.h
class BoxService : public Service {
public:
void save(Model box);
};
BoxService.cpp
void BoxService::save(Model box) {
// TODO: save box and make sure that box is of type 'Box' and not any other subtype of 'Model'
}
这打破了多态性。如果我得到一个'Service'并且我调用'save(model)',如果碰巧给了一个'BoxService',它就不会失败。逆变参数是另一种方式。如果'Service'可以保存一个'Box',那么'BoxService'可以将'Model'作为参数,因为通过'Service'的调用者将通过'Box'的Box's,但直接通过BoxService调用者'可以传递任何'Model'类型。这是C++不支持的。 – chris
为什么'BoxService'继承'Service'?一袋苹果不是一袋水果。 – aschepler
我同意!甚至可以在不破坏多态性的情况下设计一个类似于上述设计的设计? –