オーダークラスへのリストタイプのアイテムと呼ばれる複合プロパティがあります。 GUI上で、ユーザーは名前、説明、価格、数量などのいくつかのフィールドを入力し、項目の追加ボタンをクリックして、項目を注文のリストに追加します。私がしたいのは、項目のIsCompleteプロパティをチェックするメソッドを作成し、必要なプロパティが設定されていることを確認するメソッドを作成して、誰かがorder.Items.Add(item)を呼び出すことができないようにする方法ですコンプリート。アイテムのIsCompleteプロパティがfalseを返す場合は、例外がスローされるようにしたいと思います。これについて簡単な方法は何でしょうか?List.Addメソッドが呼び出されたときにチェックを行います
答えて
これは、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; }
}
ます。またObservableCollection<T>
使用することができます:それはINotifyCollectionChanged
を実装http://msdn.microsoft.com/en-us/library/ms668604.aspx
を:http://msdn.microsoft.com/en-us/library/System.Collections.Specialized.INotifyCollectionChanged.aspx以来
メソッド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())
- 1. アプリケーションがバックグラウンドから呼び出されたときにメソッドを呼び出す
- 2. "TypeError:if文(Python)でメソッドが呼び出されたときに 'str'オブジェクトが呼び出されません '
- 3. ListPreferencesが変更されたときにonPreferenceChangeメソッドが呼び出されない
- 4. メソッドが呼び出された行に例外がスローされます
- 5. クラスの他のメソッドが呼び出されたときに、クラスのメソッドを呼び出す方法(Ruby)
- 6. task.execute()が呼び出されたときにASyncTaskが実行されない
- 7. 呼び出されたときにのみメソッドを実行する方法は?
- 8. onUpgradeとonCreateが呼び出されたときに実行されません
- 9. SQLiteOpenHelperのonCreateメソッドが呼び出されたときは?
- 10. PHP:メソッドが呼び出されるたびに実行されるマジックメソッド
- 11. メソッドがラムダで呼び出されたときにブレークポイントがヒットしない
- 12. mainメソッドで呼び出されたとき、メソッドは上から下に実行されますか?
- 13. 単体テスト中にメソッド呼び出しが試行されたが、実際には呼び出していないが、実際には呼び出さない
- 14. プログラムが実行されたときにWix PlanActionメソッドが呼び出されない
- 15. チェックボックスがチェックされているときにJS関数を呼び出す
- 16. CellForRowAtIndexメソッドが呼び出されない
- 17. Ios:Delegeteメソッドが呼び出されない
- 18. メソッドonHandleIntent()が呼び出されない
- 19. JavaScriptメソッドが(ドキュメント)から呼び出されたときに完全に実行されない.ready
- 20. QGraphicsItemが選択されたときに呼び出されるメソッド
- 21. onReceiveが呼び出されないときに呼び出される
- 22. 実行時に呼び出されない印刷メソッドは、デバッグ時に呼び出されます
- 23. ASP.NETユーザーコントロールイベントが呼び出されたときにページイベントを呼び出す
- 24. オーバーライドされたメソッドを呼び出すと、オーバーライドされた呼び出しメソッドのスーパークラス
- 25. getItemCountメソッドとgetItemViewTypeメソッドがRecyclerアダプタで呼び出されたとき
- 26. pythonで呼び出されたときにbalance()メソッドが機能しない
- 27. Androidと同じメソッドが2回呼び出されました
- 28. optionmenuが閉じるときに呼び出されるメソッド
- 29. startActivityForResult()を呼び出すときにonDestroy()が呼び出されます
- 30. didReirediveメソッドが呼び出されたときにアプリケーションがフリーズする
まさに私が探していたものです。ありがとう! –