1

アプリケーションには多くの種類のオブジェクトがあります。すべてが次の状態を持つことができます: UpToDate、OutOfDate、NotComputed。オブジェクトのすべての操作は、オブジェクトの状態が UpTodate の場合にのみ許可されます。オブジェクトの状態が NotComputed または OutOfDate の場合、許可される操作は Compute と ChangeComputationParams だけです。GUI では、許可されている場合にのみ、オブジェクトに対するアクションを表示したいと考えています。そのため、オブジェクトに対する操作を GUI に表示するかどうかを返すオブジェクトごとに、Operation Validatiors オブジェクトがあります。問題は、オブジェクトに新しい操作を追加するたびに、その OperationValidator クラスに移動して、そこに新しい関数を追加する必要があることです。それはより良い方法でなければなりません。例 :

class Object1OperationValidator
{
    Object1OperationValidator(Object1& object1)
    {
       mObject1 = object1;
    }

    bool CanDoCompute()
    {
       return true;
    }

    bool CanDoChangeComputationParams()
    {
       return true;
    }

    bool CanDoOperation1()
    {
       if(mObject1.State() != UpToDate )
          return false;
       else
          return true;        
    }

    .....
    bool CanDoOperationN()
    {
        if(mObject1.State() != UpToDate )
          return false;
       else
          return true;
    }

 }
4

1 に答える 1

0

Validate 関数の実装でテンプレート化されたクラスを使用できます。

template <class T>
void CheckBaseOperations
{
public:
    CheckBaseOperations(T * obj)
        :inst(obj)
    {}

    bool CheckOperation()
    {
        //...
        return inst->State() != X;
    }
public:
    T * inst;
};
//----------------------------------------------------------------------
//for generic types
template <class T>
void CheckOperations : public CheckBaseOperations<T>
{
public:
    CheckOperations(T * obj)
        :CheckBaseOperations<T>(obj)
    {}
};

//----------------------------------------------------------------------
template <> //specific validation for a certain type.
void CheckOperations <YourType> : public CheckBaseOperations<YourType>
{
public:
    CheckOperations(YourType * obj)
        :CheckBaseOperations<YourType>(obj)
    {}

    bool CheckOperationForYourType()
    {
        //...
        return inst->State() != X;
    }
};

またCheckOperations、必要に応じて特定のタイプに特化することもできます

于 2013-10-31T12:51:55.367 に答える