2013-10-31 54 views
1

我的應用程序中有很多類型的對象。所有可以具有以下狀態:UpToDate,OutOfDate,NotComputed。對象的所有操作只有在對象的狀態爲UpTodate時才允許使用。如果對象的狀態爲NotComputed或OutOfDate,則唯一允許的操作是Compute和ChangeComputationParams。在gui中,我只想在對象允許的情況下顯示對象的動作。所以我有Operation Validatiors對象,每個對象返回對象上的操作是否應該顯示在gui上。問題是,每當我向某個對象添加新的操作時,我需要轉到它的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; 
    } 

} 
+0

難道每個對象實現一個特定類型報告界面列出了它支持的操作以及每個操作是否可支持。然後,GUI可以查詢每個對象所支持的動作(可能返回爲字符串或某種數字ID常量),然後對於每個動作,它可以查詢對象是否可以執行該動作? – Jimbo

+0

CanDoOperation中的檢查有多複雜...()?它只限於類似'obj.State()!= someState'? – Raxvan

+0

對於大多數操作檢查它只限制對象狀態。有些操作需要比狀態更多的檢查,但在大多數情況下它們很少。 – user152508

回答

0

您可以使用模板類的驗證功能的實現:

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專門的,如果你想

相關問題