2012-04-28 9 views
0

オーダークラスへのリストタイプのアイテムと呼ばれる複合プロパティがあります。 GUI上で、ユーザーは名前、説明、価格、数量などのいくつかのフィールドを入力し、項目の追加ボタンをクリックして、項目を注文のリストに追加します。私がしたいのは、項目のIsCompleteプロパティをチェックするメソッドを作成し、必要なプロパティが設定されていることを確認するメソッドを作成して、誰かがorder.Items.Add(item)を呼び出すことができないようにする方法ですコンプリート。アイテムのIsCompleteプロパティがfalseを返す場合は、例外がスローされるようにしたいと思います。これについて簡単な方法は何でしょうか?List.Addメソッドが呼び出されたときにチェックを行います

答えて

1

これは、List<T>を派生クラスにサブクラス化し、次にAddメソッドをオーバーライドすることで実現できます。

public class MyItemCollection : List<MyItem> 
{ 
    public override void Add(MyItem item) 
    { 
     if (item.IsComplete) 
     { 
      base.Add(item); 
     } 
     else 
     { 
      throw new InvalidOperationException("Unable to add an incomplete item"); 
     } 
    } 
} 

ご注文のクラスは、プロパティを持っているでしょうMyItemCollectionむしろList<T>よりも、そのよう:

public class Order 
{ 
    public MyItemCollection Items { get; set; } 
} 
+0

まさに私が探していたものです。ありがとう! –

0

メソッドAdd(T)はあなたが上書きできない仮想ではありません。

ObservableCollectionは、要素が追加されたときにイベントをスローできますが、この追加を元に戻すことはできません。

あなたは内部的storred List<T>とのインタフェースIList<T>を実装し、以下のようにexemple _list.Add(item)を呼び出す前に、方法Add(T item)に必要な検証を追加することができます。

public class MyItemCollection : IList<MyItem> 
{ 
    private List<MyItem> _list; 

    public MyItemCollection() 
    { 
     _list = new List<MyItem>(); 
    } 

    public void Add(MyItem item) 
    { 
     if (item.IsComplete) 
     { 
      _list.Add(item); 
     } 
     else 
     { 
      throw new InvalidOperationException("Unable to add an incomplete item"); 
     } 
    } 

    //Then you have to implement all the IList interface members... 

} 

この解決策の唯一の問題はそれということですボイラープレートのコードをたくさん書く必要があります。

Listの操作を担当するクラスが1つだけの場合は、対応するクラスにメソッドAddToMyItemCollection(MyItem item)を実装することもできます。 GRASPパターンを尊重しても実用的です。(Instance.getC()はInstance.getA()よりも好ましいです。getB()。getC())

関連する問題