2013-08-15 10 views
8
public class Basket 
{ 
    private int _unitCount; 

    public int UnitCount 
    { 
     get { return _unitCount; } 
     set 
     { 
      _unitCount = Math.Max(0, value); 
      OnUnitCountChanged(new EventArgs()); 
     } 
    } 

    public event EventHandler UnitCountChanged; 
    public event EventHandler Depleted; 

    protected virtual void OnUnitCountChanged(EventArgs args) 
    { 
     var handler = UnitCountChanged; 
     if(handler!=null) { handler(this, args); } 
     if(_unitCount == 0) { OnDepleted(new EventArgs()); } 
    } 

    protected virtual void OnDepleted(EventArgs args) 
    { 
     var handler = UnitCountChanged; 
     if(handler!=null) { handler(this, args); } 
    } 
} 

は枯渇のための条件をチェックし、UnitCountChangedイベント内必要であれば、そのイベントを上げる、または私はUnitCountセッターの両方をやって(そしてどこか他の非自明な例で)しなければならないとの問題がありますか?別のイベントの中からイベントを発生させるのは嫌ですか?

+1

それは項目が 'OnUnitCountChanged'イベントから枯渇していることを決定するために、非自明だ場合、私はでしょうOnDepletedイベントは冗長であると主張している。 – Matthew

+0

技術的には真ですが、私はその正確なコードを書かなければならない場所の数を最小限に抑えたいと考えていました。つまり、空のオブジェクトをコンテナから削除したり、UIにエフェクトを提示したりします。あなたのコメントを促す例があります。 –

答えて

9

私はそれを見ている間に、あなたのUnitCountセッターのような、起こるであろう方法でそれを推奨し、イベントを発生させます。 virtualというアクセス修飾キーワードがあるので、誰かがメソッドをオーバーライドでき、ベースオブジェクトを呼び出さないと期待どおりに動作しません。

私は自分のコードを使用することをより複雑にするファンではありません。

6

便利な場合があります(たとえば、基底クラスを拡張していて、イベントを発生させているメソッドをオーバーライドすることができない場合など)がありますが、一般的にはそれをお勧めします。この場合

、私はそれがUnitCountセッターの両方のイベントを発生させる方が良いかなと思う:

public int UnitCount 
{ 
    get { return _unitCount; } 
    set 
    { 
     _unitCount = value; 
     OnUnitCountChanged(new EventArgs()); 
     if(_unitCount == 0) { OnDepleted(new EventArgs()); } 
    } 
} 
関連する問題