我正在写一个购物车模拟应用程序
这是我的情况,我想强制一个类型执行它为自己定义的方法......
基本上我有一个界面
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的方法的最佳方法是什么?或者更好地获得这些错误的替代方法?我应该去自定义验证器路线吗?每个杂货项目可能有自己检查新鲜度的方式,例如牛奶与鸡蛋不同,所以我必须依赖每个单独的实施,但我想强制结账,希望这是有道理的。
答案 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
。