Inheritance UML类表示

Inheritance UML类表示,inheritance,uml,composition,class-diagram,Inheritance,Uml,Composition,Class Diagram,我正在学习UML,并希望创建一个小型餐厅应用程序,该应用程序具有菜单、菜单中包含的菜肴、菜肴中使用的产品。菜单分为不同类型,只能包含相应类型的菜单。 我认为课堂菜单和菜品应该是抽象的。 这是我的UML图 如何最好地显示抽象类之间的关系?第一次尝试 如果我们看一下需求,即订单是关于菜肴的,菜肴是由产品组成的,菜单就像某种菜肴的目录,我们会得出这样一个图表: 我们只展示抽象菜和抽象菜单之间的关系。专门的菜肴和菜单继承了这种联想。只是你必须用一个评论来表达使用与菜单兼容的菜肴的限制 进一步反思 问题是

我正在学习UML,并希望创建一个小型餐厅应用程序,该应用程序具有菜单、菜单中包含的菜肴、菜肴中使用的产品。菜单分为不同类型,只能包含相应类型的菜单。 我认为课堂菜单和菜品应该是抽象的。 这是我的UML图

如何最好地显示抽象类之间的关系?

第一次尝试 如果我们看一下需求,即订单是关于菜肴的,菜肴是由产品组成的,菜单就像某种菜肴的目录,我们会得出这样一个图表:

我们只展示抽象菜和抽象菜单之间的关系。专门的菜肴和菜单继承了这种联想。只是你必须用一个评论来表达使用与菜单兼容的菜肴的限制

进一步反思 问题是我们是否真的需要菜单专业化。如果他们有非常不同的行为,这是有道理的

此外,在您的示例中,假定菜单专门化是严格分离的。但是,如果在以后的阶段,你会有重叠的菜单,例如主菜单上有素食、纯素和肉类菜肴,而纯素菜单上只有纯素菜肴,但所有种类的菜肴都有

如果所有菜单专门化的行为都是相同的,如果这只是一个任意的分类,而且在实践中每个类只有一个实例,那么最好将菜单具体化并将其与一个类别类关联。顺便说一下,您还可以将抽象盘与一个或多个类别相关联,这样可以更容易地表达您想要的约束

最后,有必要探讨和反思订单与菜肴以及菜肴与产品之间的关系。

第一次尝试 如果我们看一下需求,即订单是关于菜肴的,菜肴是由产品组成的,菜单就像某种菜肴的目录,我们会得出这样一个图表:

我们只展示抽象菜和抽象菜单之间的关系。专门的菜肴和菜单继承了这种联想。只是你必须用一个评论来表达使用与菜单兼容的菜肴的限制

进一步反思 问题是我们是否真的需要菜单专业化。如果他们有非常不同的行为,这是有道理的

此外,在您的示例中,假定菜单专门化是严格分离的。但是,如果在以后的阶段,你会有重叠的菜单,例如主菜单上有素食、纯素和肉类菜肴,而纯素菜单上只有纯素菜肴,但所有种类的菜肴都有

如果所有菜单专门化的行为都是相同的,如果这只是一个任意的分类,而且在实践中每个类只有一个实例,那么最好将菜单具体化并将其与一个类别类关联。顺便说一下,您还可以将抽象盘与一个或多个类别相关联,这样可以更容易地表达您想要的约束

最后,有必要探讨和重新思考订单与菜肴以及菜肴与产品之间的关系。

我在did之后给出了答案,因为在他的提案的第一版中,存在一些异常的问题

订单至少包含一道菜。但一道菜并不是由菜组成的,所以没有组合,对我来说,甚至也没有聚合

一道菜至少由一种产品制成,使用一定数量的产品。根据产品的不同,数量是一个体积(例如液体),或重量(例如黄油)或数字(例如鸡蛋),等等,您可以使用类关系。关系不能是一个组合,因为给定的产品可以用于多个菜肴

菜单至少包含一道菜,但给定的菜可以在多个菜单中使用,因此不能使用构图。在我的图表中,我使用聚合,但这可能不是一个好主意

假设您总是需要为菜单和菜肴提供专门的课程,您可以:

但我不确定你是否总是需要这些专业知识,所以菜肴和菜单不是抽象的,即使它们可以有专业知识,你也可以有:

我想一道菜总是至少一份菜单的一部分,这是一种选择,因此厨师做的“准备”而不是菜单的一部分就不是一道菜

正如@Christophe在一篇评论中所说,客户可以要求一些特定的说明,例如肉类等,这些说明可以通过类关系来支持:

我在did之后给出了答案,因为在他的建议的第一个版本中存在一些异常的问题

订单至少包含一道菜。但是一道菜不是由菜组成的,所以没有组成,对我来说 甚至也不是一个集合

一道菜至少由一种产品制成,使用一定数量的产品。根据产品的不同,数量是一个体积(例如液体),或重量(例如黄油)或数字(例如鸡蛋),等等,您可以使用类关系。关系不能是一个组合,因为给定的产品可以用于多个菜肴

菜单至少包含一道菜,但给定的菜可以在多个菜单中使用,因此不能使用构图。在我的图表中,我使用聚合,但这可能不是一个好主意

假设您总是需要为菜单和菜肴提供专门的课程,您可以:

但我不确定你是否总是需要这些专业知识,所以菜肴和菜单不是抽象的,即使它们可以有专业知识,你也可以有:

我想一道菜总是至少一份菜单的一部分,这是一种选择,因此厨师做的“准备”而不是菜单的一部分就不是一道菜

正如@Christophe在一篇评论中所说,客户可以要求一些特定的说明,例如肉类等,这些说明可以通过类关系来支持:


欢迎对于刚开始学习的人来说,这是一个令人印象深刻的图表:-如果我很好地理解了你的问题,你会注意到抽象类之间存在组合关系,但你只展示了特定类之间的组合。这是一门相当高级的学科,你可以看看它是关于关联类的,但是类似的技术也可以用于组合。现在的问题是,你是否真的需要这个复杂的构造,以及具体类之间的特殊组合,或者,如果您可以在继承的抽象类之间使用组合,并添加一些约束,说明汤菜单只能由汤盘组成?抽象类的关系是什么意思?您的图表在抽象类之间没有关系。只有从抽象类到具体类的继承。顺便说一句,抽象类是用斜体字来表示的,而不是通过添加单词abstract来表示的。可能是因为我是UML的初学者,所以我没有很好地表达这个想法。我所说的关系是指应用程序中类或对象之间的链接,如果我不正确,我很抱歉。我想使用UML创建一个应用程序模型。我想在继承的抽象类之间使用一个组合,并添加一些约束,说明汤菜单只能由汤盘组成。你能提供有关UML的资料或书籍吗。很抱歉回答晚了。@Pirogov没问题,我们会帮忙的。我注意到你的混凝土盘子继承了一种有序的构图,并且有自己的构图。正如所解释的,这是非法的。在我能帮忙之前有个问题:菜单是什么?这是一个报价,是一个相关项目的目录?或者它是某种汤的组合,例如汤+主菜+甜点或不含甜点的开胃菜+主菜,或开胃菜汤-+主菜汤+甜点汤?欢迎光临。对于刚开始学习的人来说,这是一个令人印象深刻的图表:-如果我很好地理解了你的问题,你会注意到抽象类之间存在组合关系,但你只展示了特定类之间的组合。这是一门相当高级的学科,你可以看看它是关于关联类的,但是类似的技术也可以用于组合。现在的问题是,你是否真的需要这个复杂的构造,以及具体类之间的特殊组合,或者,如果您可以在继承的抽象类之间使用组合,并添加一些约束,说明汤菜单只能由汤盘组成?抽象类的关系是什么意思?您的图表在抽象类之间没有关系。只有从抽象类到具体类的继承。顺便说一句,抽象类是用斜体字来表示的,而不是通过添加单词abstract来表示的。可能是因为我是UML的初学者,所以我没有很好地表达这个想法。我所说的关系是指应用程序中类或对象之间的链接,如果我不正确,我很抱歉。我想使用UML创建一个应用程序模型。我想在继承的抽象类之间使用一个组合,并添加一些约束,说明汤菜单只能由汤盘组成。你能提供有关UML的资料或书籍吗。很抱歉回答晚了。@Pirogov没问题,我们会帮忙的。我注意到你的混凝土盘子继承了一种有序的构图,并且有自己的构图。正如所解释的,这是非法的。在我能帮忙之前有个问题:菜单是什么?这是一个报价,是一个相关项目的目录?或者它是某种汤的组合,例如汤+主菜+甜点或起司+主菜而不含甜点,或起司汤-+主菜汤+甜点汤?你们这些菜的子类都是菜单的。我想这是疏忽?避免在菜和菜之间,而不是菜和产品之间的组合有意义吗?我认为你们应该
rst定义类的含义。一道菜的实例是菜单上的项目,还是提供给顾客的食物的实际盘子。我怀疑是第一种,但在这种情况下,你不应该有一个成分来生产产品土豆泥可能是多盘菜的一部分。我不明白为什么X类菜单继承了这盘菜。首先,菜单包含菜肴,但不是一道菜。第二,在你的建议中,X菜单同时继承了菜单和菜意味着X菜单聚合了Y菜单,Y菜单可以是它自己。很可能你希望XX菜继承菜而不是XX菜Menu@bruno是的!在菜品下面应该只有菜品特产。抱歉,已经是深夜了,我在克隆我的碟子类时搞砸了。我会在今天晚些时候纠正这个问题。@Pirogov很高兴这有帮助。我已经纠正了我的打字错误,并为你们添加了更多的问题。在进一步的思考中,我添加了关于引入category类作为子类化的替代方案的想法。最后,如果你想要更多的阅读,我推荐马丁·福勒(Martin Fowler)非常实用和全面的书。在网络上,有关于这个话题的最佳资源。我现在更喜欢其他来源,因为他们添加了很多恼人的内容,但他们的内容是顶级的。我想这是疏忽?避免在订单和菜肴之间,而不是在菜肴和产品之间进行组合,这有意义吗?我想你应该首先定义类的含义。一道菜的实例是菜单上的项目,还是提供给顾客的食物的实际盘子。我怀疑是第一种,但在这种情况下,你不应该有一个成分来生产产品土豆泥可能是多盘菜的一部分。我不明白为什么X类菜单继承了这盘菜。首先,菜单包含菜肴,但不是一道菜。第二,在你的建议中,X菜单同时继承了菜单和菜意味着X菜单聚合了Y菜单,Y菜单可以是它自己。很可能你希望XX菜继承菜而不是XX菜Menu@bruno是的!在菜品下面应该只有菜品特产。抱歉,已经是深夜了,我在克隆我的碟子类时搞砸了。我会在今天晚些时候纠正这个问题。@Pirogov很高兴这有帮助。我已经纠正了我的打字错误,并为你们添加了更多的问题。在进一步的思考中,我添加了关于引入category类作为子类化的替代方案的想法。最后,如果你想要更多的阅读,我推荐马丁·福勒(Martin Fowler)非常实用和全面的书。在网络上,有关于这个话题的最佳资源。我现在更喜欢其他来源,因为他们添加了很多恼人的内容,但是他们的内容是顶级的。如果我将代码按照您的第一个图表,我创建的抽象类菜单和菜?第二个图表不包含抽象类,对吗?在你们回答之后我还有一个问题:为什么菜和菜单不应该是抽象的?我不明白它。@Pirogov在第二张图中是非抽象类,因为它是无用的。根据定义,抽象类不能实例化,因此,如果例如Dish是一个抽象类,那么所有的Dish都是直接或非直接专门化Dish的其他类的实例。非抽象类可以被专门化,所以问题不在于classX为什么不是抽象的,而在于classX为什么需要抽象。不要寻找一个复杂的解决方案,寻找一个简单的解决方案。很好的补充。您还可以在order和dish之间添加关联类。与简单的关联相比,聚合有什么好处?最后,我没有质疑抽象菜,因为我每天晚上都能观察到汤的行为与主菜不同-@Christophe I没有在订单和菜肴之间建立类关系,因为在这种情况下,数量只是一个数字,这已经由多重性管理,当然没有唯一性约束。当然,在菜单和菜肴之间使用聚合的方法总是有问题的,我使用的方法可能不是一个好方法idea@bruno好论点!但是,因此,顾客不能要求少盐、多胡椒、中号与粗号、不太热,或任何其他可能想要给服务员的具体指示-你好@bruno谢谢你的回答。如果我将代码按照您的第一个图表,我创建的抽象类菜单和菜?第二个图表不包含抽象类,对吗?在你们回答之后我还有一个问题:为什么菜和菜单不应该是抽象的?我不明白它。@Pirogov在第二张图中是非抽象类,因为它是无用的。根据定义,抽象类不能实例化,因此,如果例如Dish是一个抽象类,那么所有的Dish都是直接或非直接专门化Dish的其他类的实例。非抽象类可以是特殊类
因此,问题不是为什么classX不是抽象的,而是为什么classX需要抽象。不要寻找一个复杂的解决方案,寻找一个简单的解决方案。很好的补充。您还可以在order和dish之间添加关联类。与简单的关联相比,聚合有什么好处?最后,我没有质疑抽象菜,因为我每天晚上都能观察到汤的行为与主菜不同-@Christophe I没有在订单和菜肴之间建立类关系,因为在这种情况下,数量只是一个数字,这已经由多重性管理,当然没有唯一性约束。当然,在菜单和菜肴之间使用聚合的方法总是有问题的,我使用的方法可能不是一个好方法idea@bruno好论点!但是,因此,顾客不能要求少盐、多胡椒、中号与粗号、不太热,或任何其他可能想要给服务员的具体指示-