1

私は食料品カートのシミュレーションアプリを書いています

これが私の状況です。タイプに、それ自体で定義されたメソッドを強制的に実行させたい...

基本的に私はインターフェースを持っています

interface IGroceryCart
{
   // Other methods snipped for clarity
   void Checkout(IEnumerable<IGroceryItem> itemsToBuy);
}

IGroceryItem インターフェイスは次のようになります。

interface IGroceryItem
{
   // Other methods snipped for clarity
   CheckoutIssues EnsureFreshness();
}    

IGroceryCart と IGloceryItem には明らかに具体的な実装がありますが、私がやろうとしているのはこれです:

食料品のカートで Checkout を呼び出すと、チェックアウトされているすべてのアイテムが内部的に EnsureFreshness() メソッドを呼び出し、1 つ以上のアイテムに CheckoutIssues がある場合はそれに応じて反応するようにします。

CheckoutIssues は次のようなものです

class CheckoutIssues
{
   string Description {get;set;}
   //etc
}

各食料品でEnsureFreshnessが呼び出される方法を実装する最良の方法は何でしょうか? または、この種のエラーを取得するためのより良い代替アプローチはありますか? カスタム バリデータ ルートを使用する必要がありますか? 各食料品には、新鮮さをチェックする独自の方法がある場合があります。たとえば、牛乳は卵とは異なるため、個々の実装に依存する必要がありますが、チェックアウトでその呼び出しを強制したいと思います。

4

4 に答える 4

3

それを Checkout メソッドに入れ、返されたオブジェクトをコレクションに追加して処理することができます。

List<CheckoutIssues> issues = new List<CheckoutIssues>();
foreach (IGroceryItem item in itemsToBuy) {
    issues.Add(item.EnsureFreshness());
}
于 2012-04-19T01:49:27.073 に答える
1

さて、あなたがウォルマートに行って に商品を追加したとしましょう。レジに行くのは店員Cartの義務Cartですか、それともカウンターでレジにいる雇用主の義務ですか?

CheckoutShoppingにメソッドがあるのは配線されているように感じCartます。私があなただったら、おそらくこのルートをとります。

 interface IGroceryCart
{

   /**void Checkout(IEnumerable<IGroceryItem> itemsToBuy);**/
   void AddItem(IEnumerable<IGroceryItem> itemsToBuy)//I like to add items to Grocery Cart.
}

商品を GroceryCart に追加できるはずです。

2 つ目の問題は、Walmart でカートに商品を追加Applesしたときに、リンゴが新鮮か、期限切れか、腐っているかを認識できないことです。

    interface IGroceryItem
    { 
       CheckoutIssues EnsureFreshness(); //I am skeptic about having this method on GroceryItem
    }   

    class GroceryCart:IGroceryCart
    {
       public void AddItem(IEnumerable<IGroceryItem> itemsToBuy)
       {

       }
    }

    class Billing
   {


    public decimal BillItems(GroceryCart cart)
    {
         foreach item in cart
           if(itemIsfresh)
             Bill it.
    } 



     private bool IsItemFresh(GroceryItem item)
     {

     }

  }
于 2012-04-19T02:02:11.747 に答える
0

そのようなものを持っていないもの:

public abstract GroceryCart : IGroceryCart
{
    public void Checkout(IEnumerable<IGroceryItem> itemsToBuy)
    {
        foreach (var item in itemsToBuy)
        {
            item.EnsureFreshness();
        }

        this.InternalCheckout(itemsToBuy);
    }

    protected abstract void InternalCheckout(IEnumerable<IGroceryItem> itemsToBuy);
}

これで、インターフェースを実装するのではなく、抽象クラスから継承するだけです。また、サードパーティのクラスでは、鮮度をチェックする必要がある場合GroceryCartではなく、への参照があります。IGroceryCart必須ではない場合は、引き続き使用してIGroceryCartください。

于 2012-04-19T03:30:19.847 に答える
0

あなたが持っているものの何が問題になっていますか?itemsToBuy を反復処理して、それぞれで ConfirmFreshness を呼び出してみませんか? エラーが戻ってきた場合、Checkout は例外をスローするか、エラーのリストまたは最初のエラーのみを返すように変更できます。

それは役に立ちますか?

于 2012-04-19T01:52:53.107 に答える