我想找到一种方法,使用户产生的嵌套次数为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())
始终是一杯咖啡,零或更多的牛奶包裹着它。
答案 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)
正如其他人指出的那样,这是代表牛奶和咖啡的一种非常奇怪的方法,但是让您相信这在您的业务领域中是明智的。
执行所需操作的方法是:首先,由于返回值可以是Milk
或Coffee
,因此您需要以某种方式在类型系统中表示它。您可以创建一个公共基类或一个公共接口。假设您有一个通用的基类:
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))
加两种牛奶。Tea
,Cream
和Lemon
。Cream
或Milk
可以包装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());
}