我必须实现一个课程(在C#中,但我不认为这很重要)来保存餐馆菜单的菜单项列表。有两个要求:
每个项目可能都有一个类别,然后用于输出此项目。例如。所有类别"饮料"应该在标签下输出'饮料'。
项目可能是顶级的,即没有类别。这些物品应在其上方没有任何标签或带有某些特定标签的情况下输出。
此类的用户应该能够轻松添加项目,如果项目有项目,则指定其类别。
我当前的解决方案非常脏,并且要求类的用户提供类别,无论项目是否具有该类别。也就是说,当项目没有任何内容时,用户必须创建某种默认类别。
public class Menu
{
public ICollection<Category> Categories { get; set; }
}
public class Category
{
public string Name { get; set; }
public ICollection<MenuItem> Items { get; set; }
}
public class MenuItem
{
public string Name { get; set; }
public decimal Price { get; set; }
public Category Category { get; set; }
}
哪种数据结构/类设计可以更好地解决此问题?
编辑:
它应该以某种方式打印它们。为了更准确,这是订购系统中菜单的模型,也可以作为文本出现。此模型从解析器获取,然后表示给用户,以便他们可以手动编辑它。 例如。用户可能会在菜单字段
中编写类似的内容item1 {22}
第2项{33}
- Category1--
第3项{44}
然后将其转换回菜单,然后,当提交菜单时,以一种奇特的方式输出给最终用户。
更新结构:
经过一番考虑后,我提出了这个设计:
public abstract class MenuItem
{
public string Name { get; set; }
public abstract bool IsCategory();
public abstract decimal Price();
public abstract ICollection<MenuItem> Items();
}
public class Dish : MenuItem
{
private readonly decimal price;
public Dish(decimal price)
{
this.price = price;
}
public override bool IsCategory()
{
return false;
}
public override decimal Price()
{
return price;
}
public override ICollection<MenuItem> Items()
{
return new List<MenuItem>(); //or null
}
}
public class Category : MenuItem
{
public ICollection<MenuItem> Items { get; private set; }
public Category() : this(new List<MenuItem>()) { }
public Category(ICollection<MenuItem> items)
{
this.Items = items;
}
public override bool IsCategory()
{
return true;
}
public override decimal Price()
{
return 0; //or make price nullable and return null
}
public override ICollection<MenuItem> Items()
{
return Items;
}
}
其中Menu有一个MenuItem列表。