リスト型のアイテムと呼ばれる複合プロパティを注文クラスに持っています。GUI で、ユーザーは名前、説明、価格、数量などのいくつかのフィールドに入力し、[アイテムの追加] ボタンをクリックします。これにより、もちろん注文のアイテム リストにアイテムが追加されます。私がやりたいのは、必要なプロパティが設定されていることを確認するチェックを行うアイテムの IsComplete プロパティをチェックするメソッドを作成して、そうでない場合に誰かが order.Items.Add(item) を呼び出すことができないようにすることです完了。そうでない場合、アイテムの IsComplete プロパティが false を返した場合に例外をスローしたいと思います... これについて簡単に行う方法は何でしょうか?
3 に答える
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; }
}
メソッドAdd(T)
は仮想ではないため、オーバーライドできません。
ObservableCollection では、要素が追加されたときにイベントをスローできますが、この追加を元に戻すことはできません。
以下の例のように、保存された内部を使用IList<T>
してインターフェイスを実装し、必要な検証をメソッドに追加してから呼び出すことができます。List<T>
Add(T item)
_list.Add(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...
}
このソリューションの唯一の問題は、多くのボイラープレート コードを記述する必要があることです。
の操作を担当するクラスが 1 つだけの場合は、担当クラスList
にメソッドを実装することもできますAddToMyItemCollection(MyItem item)
。GRASP パターンで保護されたバリエーション(Instance.getA().getB().getC() よりも Instance.getC() を使用することをお勧めします) を尊重しているため、これは実践的な方法でもあります。
使用することもできますObservableCollection<T>
: http://msdn.microsoft.com/en-us/library/ms668604.aspx
実装しますINotifyCollectionChanged
: http://msdn.microsoft.com/en-us/library/System.Collections.Specialized.INotifyCollectionChanged .aspx