2009-06-23 6 views
5

私はイベントをゲームモデルの一部として使用しています。拡張性とコードのために、私は大部分の行動を拒否できる必要があります。私が好きな何"拒否権"イベントを実装する標準的な方法はありますか?

public event TryingToDoSomethingHandler TryingToDoSomething; 
public event SomethingHappenedHandler SomethingHappened; 

/* 
* Returning true indicates Something happened successfully. 
*/ 
public bool DoSomething(...) 
{ 
    //Need a way to indicate "veto" here 
    TryingToDoSomething(...); 

    //Actual do it 

    SomethingHappened(...); 

    return true; 
} 

がTryingToDoSomethingためである(...)が登録されているイベントハンドラのオブジェクトを示すことができるようにする:

はより明確に、副作用を持っているほぼすべての方法は、この形式を取り(falseを返すこと、outパラメータを変更することなど)。 。C#の/ NETでこれを行うには受け入れられたかの標準的な方法はあり

/* 
* Returning true indicates Something happened successfully. 
*/ 
public bool DoSomethingImproved(...) 
{ 
    //Pretty sure multicast delegates don't work this way, but you get the idea 
    if(!TryingToDoSomething(...)) return false; 

    //Actual do it 

    SomethingHappened(...); 

    return true; 
} 

:コードは道徳的に同等になるように?

答えて

6

キャンセル可能なイベントについて考えていますか?フレームワークはこれを広範囲に使用します。

get/setを実装するCancelプロパティを持つEventArgsクラスを作成します。その後、イベントハンドラはというプロパティをCancelに設定することができます。

public bool TrySomething() 
{ 
    CancelEventArgs e = new CancelEventArgs(); 
    if (Event1 != null) Event1.Invoke(e); 
    if (e.Cancel == false) 
    { 
     if (Event2 != null) Event2.Invoke(e); 
    } 
} 
+0

私のJava(命名)ルーツはもう一度私をハンディキャップします。これはまさに私が探していたものです。 –

関連する問題