C# 如何添加用户生成的嵌套参数数?

C# 如何添加用户生成的嵌套参数数?,c#,C#,我想找到一种方法,通过用户多次生成x来嵌套参数 举个例子,我创建了几个类,让我们称它们为Milk()和Coffee() 假设用户想要一杯咖啡,加两杯牛奶,我会制作这个对象 var item = new Milk(new Milk(new Coffee())) 如果用户想要一杯只有一杯牛奶的咖啡呢?那么它看起来是这样的: var item = new Milk(new Coffee()); 或者只是咖啡本身: var item = new Coffee(); 我想找到一个方法来做这个。我考虑

我想找到一种方法,通过用户多次生成x来嵌套参数

举个例子,我创建了几个类,让我们称它们为
Milk()
Coffee()

假设用户想要一杯咖啡,加两杯牛奶,我会制作这个对象

var item = new Milk(new Milk(new Coffee()))
如果用户想要一杯只有一杯牛奶的咖啡呢?那么它看起来是这样的:

var item = new Milk(new Coffee());
或者只是咖啡本身:

var item = new Coffee();
我想找到一个方法来做这个。我考虑过循环指定的数量,但我不知道如何不断添加嵌套参数并将其保存到变量中

这是我的代码,但我知道它与我试图做的并不接近

for (int i = 0; i < numericUpDownMilk.Value; i++)
{
    item += new Milk();
}


始终只有一杯咖啡和零杯或更多牛奶包装。

一个非常简单的基本实现:

// have a base class (or an interface), that Milk, Coffee, etc derive from (or implement)
// the main thing is the abstraction part.
public abstract class Ingredient 
{
   // define anything common in here, and/or something all subclasses MUST implement
}

// let Milk, Coffe, etc extend that class
public class Milk : Ingredient
{
     // special fields, properties, methods for Milk
}
现在你可以在其他地方使用通用列表

List<Ingredient> ingredients = new List<Ingredient>();
ingredients.Add(new Coffee(Coffe.Types.DECAF));  // arguments just as example
ingredients.Add(new Milk(Milk.Types.ZEROLACTOSE));
ingredients.Add(new Milk(Milk.Types.REGULAR));
List成分=新列表();
配料。添加(新咖啡(Coffe.Types.DECAF));//作为示例的参数
添加(新牛奶(牛奶.类型.零乳糖));
成分。添加(新牛奶(牛奶。类型。普通牛奶));
在您的情况下,可能是:

for (int i = 0; i < numericUpDownMilk.Value; i++)
{
    ingredients.Add(new Milk());
}
for(int i=0;i
等待,等待,等待-停止,减速

首先,我需要解释一下您实际使用该代码做了什么:

var item = new Milk(new Milk(new Coffee()))
。。。这是创造一种新的咖啡。到目前为止还不错。然后它使用新咖啡作为构造器创建新牛奶的参数。然后它使用这个新的Milk对象作为创建另一个Milk对象的参数

好的,让我们后退几步。你说的是如何知道一个人在喝咖啡时要喝多少牛奶,对吗

试试这个尺码:

class Coffee
{
    int numberOfMilks;
}
现在,如果你想要一杯两杯牛奶的咖啡,你可以用这个:

Coffee order = new Coffee();
order.numberOfMilks = 2;
有道理吗?你不需要创建一个“牛奶对象”或“多个牛奶对象”——牛奶的数量只是他们点的咖啡的一个属性

编辑:好的,对于OP和任何需要答案的人,首先,向代码质量之神做一个简短的宽恕祈祷。(说真的,我很难弄明白为什么你必须这么做,但是……哦,好吧。)

这两者之间没有区别:

Milk a = new Milk(new Milk());

毕竟,在第一个版本中,它创建了一个新的Milk对象。。。然后将其输入第二个Milk对象的构造函数。第二个版本的唯一区别在于,它将其分解为两个命令,而不是将它们一起训练

好吧,希望这会照亮道路。因为你总是可以这样做:

Milk nestedMilks = new Milk();
for (int i = 1; i < nestedAmount; i++)
{
    nestedMilks = new Milk(nestedMilks);
}
Coffee final = new Coffee(nestedMilks);
Milk nestedMilks=新牛奶();
对于(int i=1;i

。。。你可以这样做。应该是另一回事。(不确定地球上所有这些实例都是这样嵌套的是否有意义。)

正如其他人所指出的,这是一种非常奇怪的表示牛奶和咖啡的方式,但让我们相信您的话,这在您的业务领域是合理的

做你想做的事情的方法是:首先,由于返回可以是
牛奶
咖啡
,因此你需要在类型系统中以某种方式表示它。您可以创建公共基类或公共接口。假设您有一个公共基类:

abstract class Beverage {}
sealed class Coffee : Beverage {}
sealed class Milk : Beverage {}
分类好类型后,从签名开始:

public static Beverage MakeCoffee(int milks)
{ /* a miracle happens */ }
现在试着去填补这个奇迹。会发生什么?好吧,你先来杯咖啡:

public static Beverage MakeCoffee(int milks)
{
    Beverage b = new Coffee();
现在我们把它包在一些牛奶里:

    for (int i = 0; i < milks; i += 1)
        b = new Milk(b);
    return b;
}
for(int i=0;i
我们完成了

  • 练习:在
    Milk
  • 练习:在
    牛奶
    咖啡
    上实现
    公共重写字符串ToString()
    ,这样当你在两杯牛奶的咖啡上调用字符串时,你就可以把它取出来
  • 锻炼:现在做
    奶油
    柠檬
  • 锻炼:(很难!)你如何实施
    奶油
    牛奶
    可以包裹
    咖啡
    但不能同时将
    奶油
    柠檬
    放入
    的规则

你在找IList吗?@Progman老实说,我不知道那是什么。我在谷歌上搜索了你的问题,但我没有找到确切的方法来帮助我理解你的意思。首先要做的是使问题更加具体化。首先:如果用户什么都不想要,你希望发生什么?没有牛奶,没有咖啡。这种情况曾经出现过吗?如果是这样,你需要说出你想要发生什么。第二个问题:你是否曾经遇到过这样的情况:有一种
咖啡
,它“在”某物之外;也就是说,您是否曾经喝过
新咖啡(新咖啡())
新咖啡(新牛奶())
?还是总是一杯咖啡,零杯或更多的牛奶“包裹”着它?@EricLippert我已经按照你的要求更新了描述。在你编辑后,牛奶和咖啡的例子似乎不是一个好选择,因为如果是咖啡中的牛奶还是牛奶中的咖啡,这没有什么区别。。。(是的,有人可能会说第一杯是“浓缩咖啡”,第二杯是“拿铁”。)那么,真正的用途是什么?是的,直到有一天,一位用户想要一杯牛奶和一杯大豆……还有一点泡沫。我知道这听起来很疯狂,但我必须这样做,这不仅仅是为了我给你的简单咖啡的例子,这只是为了让我能理解如何处理更复杂的问题。实际上,我必须这样做,如果不是这样,我就不会一直在寻找这个让我们把
ToString()
方法放在
Bever上
public static Beverage MakeCoffee(int milks)
{ /* a miracle happens */ }
public static Beverage MakeCoffee(int milks)
{
    Beverage b = new Coffee();
    for (int i = 0; i < milks; i += 1)
        b = new Milk(b);
    return b;
}