【发布时间】:2021-03-08 21:40:53
【问题描述】:
所以最近我一直在学习更多关于 C# OOP 的知识——特别是如何使用继承、组合和聚合。
我在一个练习任务的上下文中执行此操作,该任务要求为餐厅类型的服务构建一个订购 API。具体来说,该任务要求一个菜单。菜单可以有多种类型,例如午餐菜单、晚餐菜单等。然后每个菜单具有多个类别,例如开胃菜、主菜、甜点等。然后一个类别可以属于多个菜单。然后每个类别也有子类别,因此例如 Starter 可以有冷热选项。在一个子类别中,里面有多个食物,因此对于午餐菜单(菜单)上的 Starters(类别)中的热项目(子类别),可以有汤、比萨饼等。
根据我对任务和 OOP 的理解,这需要组合而不是继承。这是因为每个 Class 都有其他类型的类 - Menu HAS 类别,类别 HAS 子类别等。
所以我构建了如下类:
菜单类:
public class Menu
{
public Menu()
{}
public Menu(long Id, string Name)
{
this.id = Id;
this.name = Name;
}
private long id;
private string name;
}
类别类:
public class Category
{
public Category()
{}
public Category(Menu menu, long categoryID, string Name)
{
this._menu = menu;
this.CategoryID = categoryID;
this.name = Name;
}
private Menu _menu;
public long CategoryID { get; set; }
private string name { get; set; }
}
子类别类:
public class Subcategory
{
public Subcategory()
{}
public Subcategory(Category category, int subcategoryID, string Name)
{
this._category = category;
this.SubcategoryID = subcategoryID;
this.name = Name;
}
private Category _category;
private long SubcategoryID { get; set; }
private string name { get; set; }
}
最后是 FoodItem 类:
public class FoodItem
{
public FoodItem()
{}
public FoodItem(Subcategory subcategory, long Id, string Name, string Size)
{
this._subCategory = subcategory;
this.Id = Id;
this.name = Name;
this.size = Size;
}
private Subcategory _subCategory;
public long Id { get; set; }
public string name { get; set; }
public string size { get; set; }
}
所以我所做的就是按照在线示例进行操作——创建每个子类中的超类实例并将其传递给构造函数。这意味着除非还创建了超类,否则子类不能存在 - Category 需要 Menu,子类别需要类别,而 fooditem 需要子类别。
我的问题是:
- 我现在遇到的问题是实例化 FoodItem。要创建 FoodItem,是否需要创建 Menu 对象,然后创建 Category 对象并将 Menu 对象放入,创建子类别并将 Category 放入,然后创建 FoodItem 并将子类别放入?那会是正确的吗?还是我只是创建一个 FoodItem,其余的都是自动创建的?我认为第一个选项是正确的,但想澄清一下。
- 我的假设是否正确,即合成是正确的方法?还是继承更好?
- 为了完成任务,我需要能够创建 FoodItems 并发布到 API。假设我做问题 1 的方法是正确的,我将如何创建 FoodItem 所需的超类?
非常感谢任何方向。
【问题讨论】:
标签: c# oop inheritance aggregation composition