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

时间:2019-04-01 21:21:05

标签: c#

我想找到一种方法,使用户产生的嵌套次数为x次数。

一个例子就是我做了一些课程,我们称它们为Milk()Coffee()

假设用户想要一杯咖啡和两种牛奶,我会做这个对象。

var item = new Milk(new Milk(new Coffee()))

如果用户只喝一杯牛奶,想要喝咖啡怎么办?然后看起来像这样:

var item = new Milk(new Coffee());

或者只喝咖啡:

var item = new Coffee();

我想找到一种方法。我已经考虑过遍历指定的数量,但是我不知道如何不断添加嵌套参数并将其保存到变量中。

这是我拥有的代码,但我知道它与Im试图做的事情不相近。

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

我知道这不会起作用,因为它没有添加到参数中。我希望将其添加到嵌套的特定参数中。

编辑:

如果没有选择任何Coffee(),也会出现一个消息框,指出错误,并且该项目不可能在咖啡中加入咖啡,或者在咖啡中加入牛奶。

没有

new Coffee(new Coffee()) 

new Coffee(new Milk())

始终是一杯咖啡,零或更多的牛奶包裹着它。

3 个答案:

答案 0 :(得分:2)

等待,等待,等待-停止,减速。

首先,我需要解释一下该代码的实际用途:

var item = new Milk(new Milk(new Coffee()))

...这正在创建新的咖啡。到目前为止很好。然后,它将新的Coffee用作构造函数的参数来创建新的Milk。然后使用那个新Milk对象作为创建另一个 milk对象的参数。

好的,让我们备份几个步骤。您谈论的是如何知道该人想要喝多少牛奶,对吧?

试穿以获取尺寸:

class Coffee
{
    int numberOfMilks;
}

现在,如果您想喝加两种牛奶的咖啡,则可以使用以下方法:

Coffee order = new Coffee();
order.numberOfMilks = 2;

有道理吗?您不需要创建“牛奶对象”或“多个牛奶对象”-牛奶的 number 只是他们订购的咖啡的属性。

编辑:好吧,对于OP和任何需要原样回答问题的人?首先,简短地祈祷一下代码质量之神。 (严重的是,我很难弄清楚为什么这是您必须要做的,但是……哦。)

两者之间没有区别

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

var intermediate = new Milk();
Milk a = new Milk(intermediate);

毕竟,在第一个版本中,它将创建一个新的Milk对象...,然后将其提供给第二个Milk对象的构造函数。第二个版本中的唯一区别是它将其分为两个命令,而不是将它们拼在一起。

好的,所以应该希望能为您提供帮助。因为您可以随时执行以下操作:

Milk nestedMilks = new Milk();
for (int i = 1; i < nestedAmount; i++)
{
    nestedMilks = new Milk(nestedMilks);
}
Coffee final = new Coffee(nestedMilks);

...您可以做类似的事情。 应该完全是另一回事。 (不确定在地球上是否将所有这些实例都这样嵌套)。

答案 1 :(得分:2)

正如其他人指出的那样,这是代表牛奶和咖啡的一种非常奇怪的方法,但是让您相信这在您的业务领域中是明智的。

执行所需操作的方法是:首先,由于返回值可以是MilkCoffee,因此您需要以某种方式在类型系统中表示它。您可以创建一个公共基类或一个公共接口。假设您有一个通用的基类:

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;
}

我们完成了。

  • 锻炼:在Milk
  • 上实现构造函数
  • 锻炼:在public override string ToString()Milk上实施Coffee,这样当您在喝咖啡时将其返回字符串Milk(Milk(Coffee))加两种牛奶。
  • 锻炼:现在执行TeaCreamLemon
  • 锻炼 :(很难!)您将如何实施CreamMilk可以包装Coffee但不能放入{{1 }}和Cream同时插入Lemon

答案 2 :(得分:0)

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

// 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));

在您的情况下,可能是:

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