3

デザインに問題があります。

私は、インターフェースA(抽象構造)と、派生クラスを知らなくてもインターフェースAを使用するクラスWに実装されたワークフローを備えたポリモーフィック構造を持っています。これはDLL1に実装されており、A*を返すことができるファクトリインターフェイスFがあります。DLL2には、A1、A2などのAの具体的な実装と、A1およびA2インスタンスを作成できるファクトリ実装F1があります。

私が持っているファクトリーインターフェースはこんな感じです。

enum ObjectType{typeA1, typeA2};

class F
{
    public:
    A* create(enum ObjectType) = 0;
}

DLL1とDLL2の両方を知っているクライアントクラスによって、具体的なオブジェクトタイプがわかります。

しかし、DLL1を作成するときに、具象クラスの可能なタイプを事前に知っておく必要があるため、これは醜いです。そして、これは多態的なデザインの私の目的をほとんど打ち負かします。私はこれをしたくありません。

私が考えることができる代替オプションは、列挙の代わりに文字列を使用することです。ただし、文字列はタイプセーフではなく、エラーが発生しやすいため、文字列は避けたいと思います。クラスと同じように、継承によって列挙型を拡張する機会があればいいのにと思います。

私の質問:

より良い方法はありますか?C ++ 11で列挙型の拡張は可能ですか?(私は今それを持っていませんが)

4

2 に答える 2

1

抽象化を変更して、インターフェイスのユーザーがAそれを作成する特定のファクトリも提供できるようにすることができます。( を提供する代わりにenum)。

// In DLL1
class AbstractF {
public:
    virtual A * create () = 0;
};

template <typename ConcreteA>
class ConcreteF : public AbstractF {
public:
    A * create () { return new ConcreteA; }
};

ここで、ConcreteF<>の適切な具体的なインスタンスを作成する必要があるフレームワークの部分について、それぞれをコードに DLL1 に渡す必要がありますA。したがって、フレームワークのユーザーは、を渡すことによってではなく、正しい(つまりまたは) を渡すことによって、どちらを作成するA1かをフレームワークに通知する必要があります。A2ObjectTypeConcreteFConcreteF<A1>ConcreteF<A2>

于 2012-07-05T16:48:06.547 に答える
0

DDL2 に「string-to-int」インターフェースを持たせて、一度文字列を変換し、その id を実際のファクトリへの引数として使用するのはどうですか? DLL2 が文字列を認識しない場合、作成プロセスはその場で失敗する可能性があります。

于 2012-07-05T16:21:35.573 に答える