1

像这样组合我的对象(作为策略)似乎是一个很好的策略:

template<typename FluxType, typename SourceType>
class Model : public FluxType, public SourceType
{ };
//later in the code:
template<typename FluxType, typename SourceType>
class ConcreteModel : public Model<FluxType, SourceType>
{};

但是,FluxTypeSourceType是使用相同数据的类。所以我使用了虚拟继承:

class ConcreteModelProps{};
class ConcreteFlux : virtual public ConcreteModelProps
{};
class ConcreteFlux2 : virtual public ConcreteModelProps
{/*sligthly different implementation*/};
class ConcreteSource : virtual public ConcreteModelProps
{};
class DefaultSource2 
{/*no need for data*/};

这样我就可以ConcreteModel用不同FluxTypeSourceType对象来组成我的。

ConcreteModel<ConcreteFlux, DefaultSource2> /*or whatever*/.

事实是 中定义的数据ConcreteModelPropsConcreteModel. 在我看来,我至少做错了什么。我怎样才能使这个设计更好?最好没有虚拟继承?谢谢,dodol

4

1 回答 1

1

好吧,这很简单:您通过继承来违反LISKOV 替换原则;所以你付出代价是正确的。ConcreteFluxConcreteModelProps

现在,如果您将数据外部化,您可能会使用更健全的模型。

template <typename FluxType, typename SourceType>
class Model {
public: 
    typedef typename FluxType::DataType DataType;
}; // class Model

template <typename M>
class ConcreteModel: public M {
}; // class ConcreteModel

进而:

class ConcreteFlux {
public:
    typedef ConcreteModelProps DataType;
};

class ConcreteSource {
public:
    typedef ConcreteModelProps DataType;
};

template <typename Data>
class DefaultSource {
    typedef Data DataType;
};

最后:

class ConcreteModel<Model<ConcreteFlux, ConcreteSource>> {};

当然,这意味着现在所有的方法ConcreteFluxConcreteSource需要ConcreteModelProps在它们的每个方法中传递句柄。这就是外化的意义所在。

于 2013-02-12T12:49:42.353 回答