我有一个练习,要求我们为以下内容提供UML图:
学生可以是工人。工人也可以是学生。我怎样才能做到这一点?
这是我的解决方案,但我知道这是没有效率的:

发布于 2018-05-25 14:05:23
可能的解决办法如下:

此解决方案在学生同时是工人的情况下增加了一个额外的类。
首次更新
下图显示了StudentWorker如何从Worker和Student继承,尽管这在每种编程语言中都是不可能的,可能还会导致钻石问题。

第二次更新
此解决方案仅使用实现接口:

请注意,您仍然需要3类。Student和Worker分别实现两个接口,StudentWorker实现所有三个接口。这使得所有三个类都是Person,Student是IStudent,Worker是IWorker,StudentWorker是IStudent和IWorker。我希望这有助于或给您一个关于如何创建您的个人解决方案的想法。
发布于 2018-05-25 13:49:54
学生和工人都将是类人的子类。人将具有共同的属性(姓名和姓氏)。学生有学习成绩,工人有工资。
这就是用UML表示继承的方法:

您有一个超类和派生类。由于您的超类是抽象的,因此它将有没有实现的声明的方法,因此您将在类Student和Worker中实现它们(如果有必要的话)。
如果您有另一个班的学生-工人,它将继承从学生和工人。所以会是这样的:

A是抽象类的人,B和C分别是学生和工人,D是StudentWorker。StudentWorker将继承“学生”和“工作人员”的属性。
发布于 2018-06-05 03:12:28
这可能是你练习的答案,也可能不是答案。如果我在现实世界中有这些要求,我会重构它们。(当然,在现实世界中,我也会对进一步的改进和细节有很多疑问。)现实世界的情况是(我们可以假设),我们所处理的人总是有一个名字和姓氏。由于当person专门化为子类时,名称和姓氏不会改变(我们也可以假定),因此没有理由提供在子类中以不同方式实现它们的方法。因此,没有理由使person类抽象,因为这就是为什么要创建抽象类。
在这种情况下,聚合(一个类“有”其他类)比继承(子类“是”超类)更有意义。因此,我会以这样的方式重组这些要求:
个人:姓名,姓学生:学校,职系工人:工资
Person类可能“有”零到一个学生类。Person类可能“有”零到一个工作类。
这也意味着,通过要求人是抽象的,一个人必须是一个学生,一个工人,或者两者兼而有之。这可以由两个类之间的or约束指定。
下面是一个图表:

Person类与学生类和工人类都有总体关系。一个人班可能有零到一个学生班。一个人类也可能有零到一个工作类。{or}约束进一步指定,必须有一个学生或工人,或每一个。
https://stackoverflow.com/questions/50530616
复制相似问题