强制执行方法

时间:2012-04-19 01:41:39

标签: c# .net algorithm

我正在写一个购物车模拟应用程序

这是我的情况,我想强制一个类型执行它为自己定义的方法......

基本上我有一个界面

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

现在IGroceryItem界面看起来像这样

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

IGroceryCart和IGroceryItem显然有具体的实现,但我想要做的是:

当我在购物车上调用Checkout时,我希望所有正在检出的项目在内部调用他们的EnsureFreshness()方法,然后相应地做出反应,如果一个或多个项目有CheckoutIssues

CheckoutIssues就像是

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

实现在每个杂货项目上调用EnsureFreshness的方法的最佳方法是什么?或者更好地获得这些错误的替代方法?我应该去自定义验证器路线吗?每个杂货项目可能有自己检查新鲜度的方式,例如牛奶与鸡蛋不同,所以我必须依赖每个单独的实施,但我想强制结账,希望这是有道理的。

4 个答案:

答案 0 :(得分:3)

您可以将它放在Checkout方法中,并将返回的对象添加到某个集合中来处理:

List<CheckoutIssues> issues = new List<CheckoutIssues>();
foreach (IGroceryItem item in itemsToBuy) {
    issues.Add(item.EnsureFreshness());
}

答案 1 :(得分:1)

好吧,让我们说你去沃尔玛并向Cart添加物品,Cart是否有义务结账,或者是结账时雇主的义务?

我觉得在购物Checkout上使用方法Cart是有道理的。如果我是你,我可能会走这条路。

 interface IGroceryCart
{

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

我应该可以将物品添加到GroceryCart。

第二个问题是当你在沃尔玛的购物车中添加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)
     {

     }

  }

答案 2 :(得分:0)

你有什么问题?为什么不迭代你的itemsToBuy并在每个上调用EnsureFreshness?如果有任何错误返回,Checkout可能会抛出异常,或者可能会更改它以返回错误列表,或者只返回第一个错误。

这有帮助吗?

答案 3 :(得分: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