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、さまざまなFluxTypeオブジェクトSourceTypeで構成できます。

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

実際には、 で定義されているデータConcreteModelPropsは と密接に関連していConcreteModelます。少なくとも何か間違ったことをしているように思えます。このデザインをより良くするにはどうすればよいですか?できれば仮想継承なしで?thx、ドドル

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>> {};

もちろん、これは、 と のすべてのメソッドにConcreteFlux、それぞれのメソッドでConcreteSourceハンドルを渡す必要があることを意味します。外在化ConcreteModelPropsとはそういうことです。

于 2013-02-12T12:49:42.353 に答える