1

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

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

基本上我有一个界面

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

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结账的责任还是柜台雇主的责任?

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

 interface IGroceryCart
{

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

我应该能够将 Item 添加到 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)
     {

     }

  }
于 2012-04-19T02:02:11.747 回答
0

你所拥有的有什么问题?为什么不遍历您的 itemsToBuy 并在每个项目上调用 EnsureFreshness?如果返回任何错误,Checkout 可能会抛出异常,或者可以将其更改为返回错误列表,或者仅返回第一个错误。

这有帮助吗?

于 2012-04-19T01:52:53.107 回答
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 回答