Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制执行一个方法_C#_.net_Algorithm - Fatal编程技术网

C# 强制执行一个方法

C# 强制执行一个方法,c#,.net,algorithm,C#,.net,Algorithm,我正在写一个购物车模拟应用程序 这是我的情况,我想强制一个类型执行它为自己定义的方法 基本上我有一个界面 interface IGroceryCart { // Other methods snipped for clarity void Checkout(IEnumerable<IGroceryItem> itemsToBuy); } IGroceryCart和IGroceryItem显然有具体的实现,但我想做的是: 当我在购物车上调用Checkout时,我希望所有正

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

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

基本上我有一个界面

interface IGroceryCart
{
   // Other methods snipped for clarity
   void Checkout(IEnumerable<IGroceryItem> itemsToBuy);
}
IGroceryCart和IGroceryItem显然有具体的实现,但我想做的是:

当我在购物车上调用Checkout时,我希望所有正在签出的项目在内部调用其insureRefresh()方法,然后在一个或多个项目出现签出问题时做出相应的反应

签出问题就像

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

什么是最好的方式来实现一种方式,确保每一个食品杂货项目都有新鲜感?还是另一种更好地获得此类错误的方法?我应该走定制验证器路线吗?每个杂货店的商品可能都有自己的检查新鲜度的方法,例如牛奶和鸡蛋,因此我必须依赖于每个单独的实现,但我想强制要求结帐,希望这是有意义的。

您可以将其放入结帐方法中,并将返回的对象添加到某个集合中以处理:

List<CheckoutIssues> issues = new List<CheckoutIssues>();
foreach (IGroceryItem item in itemsToBuy) {
    issues.Add(item.EnsureFreshness());
}
列表问题=新列表();
foreach(itemsToBuy中的iRoceryItem项目){
添加(item.resh());
}

您可以将其放在签出方法中,然后将返回的对象添加到某个集合中以处理:

List<CheckoutIssues> issues = new List<CheckoutIssues>();
foreach (IGroceryItem item in itemsToBuy) {
    issues.Add(item.EnsureFreshness());
}
列表问题=新列表();
foreach(itemsToBuy中的iRoceryItem项目){
添加(item.resh());
}

你的东西怎么了?为什么不反复浏览一下你的物品,然后在每一件物品上都买一件并打电话给他们?如果返回任何错误,签出可能会引发异常,或者可以将其更改为返回错误列表,或者仅返回第一个错误


这有帮助吗?

你的东西有什么问题吗?为什么不反复浏览一下你的物品,然后在每一件物品上都买一件并打电话给他们?如果返回任何错误,签出可能会引发异常,或者可以将其更改为返回错误列表,或者仅返回第一个错误


这有帮助吗?

好吧,假设你去沃尔玛,将物品添加到
购物车中,是
购物车的责任还是柜台的雇主的责任

我觉得在购物
购物车
上有方法
结帐
。如果我是你,我可能会走这条路

 interface IGroceryCart
{

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

好吧,假设你去沃尔玛,将物品添加到
购物车中,是
购物车的责任还是柜台的雇主的责任

我觉得在购物
购物车
上有方法
结帐
。如果我是你,我可能会走这条路

 interface IGroceryCart
{

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

如果没有这样的东西:

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);
}
public abstract GroceryCart:IGroceryCart
{
公共无效签出(IEnumerable itemsToBuy)
{
foreach(itemsToBuy中的var项目)
{
项目。确保新鲜度();
}
这个.InternalCheckout(itemsToBuy);
}
受保护的抽象无效内部签出(IEnumerable itemsToBuy);
}

现在只从抽象类继承,而不是实现接口。在您的第三方类中,当您需要检查新鲜度时,请参考
GroceryCart
,而不是
IGroceryCart
。如果不是强制性的,请继续使用
IGroceryCart

没有类似内容的:

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);
}
public abstract GroceryCart:IGroceryCart
{
公共无效签出(IEnumerable itemsToBuy)
{
foreach(itemsToBuy中的var项目)
{
项目。确保新鲜度();
}
这个.InternalCheckout(itemsToBuy);
}
受保护的抽象无效内部签出(IEnumerable itemsToBuy);
}

现在只从抽象类继承,而不是实现接口。在您的第三方类中,当您需要检查新鲜度时,请参考
GroceryCart
,而不是
IGroceryCart
。如果不是强制性的,请继续使用
IGroceryCart

作为旁注,您可能需要重命名一些内容以使其更清晰:我将CheckoutIssues更改为CheckoutIssue(如果您需要返回多个问题,请返回一个集合)。另外,与GetFreshnessIssues()或类似的方法相比,Refresh()可能更好。作为补充说明,您可能需要重命名一些内容以使其更清晰:我将CheckoutIssues更改为CheckoutIssue(如果您需要返回多个问题,请返回一个集合)。另外,Refresh()可能比GetFreshnessIssues()更好。是的,这很有意义,我只是想知道在编程中是否有更聪明的事情可以做,或者我遗漏了一些明显的事情,“聪明”几乎总是一个需要避免的形容词。您可能需要将itemsToBuy移到具体实现中的一个字段,改名为“物品”或“杂货”-但我想这只是你的例子简化的一部分。是的,这很有意义,我只是想知道我能做什么更聪明的事情,或者我在编程中遗漏了什么,“聪明”几乎总是一个需要避免的形容词。您可能会将itemsToBuy移动到具体实现中的一个字段,重命名为“items”或“groceries”-但我认为这只是示例简化的一部分。您将对象与现实世界相关联是正确的,但我认为它在这个应用程序中不实用。海报上说,每种商品的新鲜度检查都会有所不同,因此对其进行评估可能更有意义。这在现实世界中是真实的:为了确定面包是否新鲜,我会寻找是否没有霉菌,以及是否有软面包。另一方面,某些水果应该是坚硬的。把它放在item类中对我来说更有意义。实际上,你可以将整个职责委托给一个单独的类。而不是穿上它