首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java学生工作者项目多重继承

Java学生工作者项目多重继承
EN

Stack Overflow用户
提问于 2018-05-25 13:43:59
回答 3查看 1.6K关注 0票数 3

我有一个练习,要求我们为以下内容提供UML图:

  • 人类(摘要)
  • 学生(姓名、姓氏、学校、年级)
  • 工人(姓名、姓氏、工资)

学生可以是工人。工人也可以是学生。我怎样才能做到这一点?

这是我的解决方案,但我知道这是没有效率的:

EN

回答 3

Stack Overflow用户

发布于 2018-05-25 14:05:23

可能的解决办法如下:

此解决方案在学生同时是工人的情况下增加了一个额外的类。

首次更新

下图显示了StudentWorker如何从WorkerStudent继承,尽管这在每种编程语言中都是不可能的,可能还会导致钻石问题。

第二次更新

此解决方案仅使用实现接口:

请注意,您仍然需要3类。StudentWorker分别实现两个接口,StudentWorker实现所有三个接口。这使得所有三个类都是PersonStudentIStudentWorkerIWorkerStudentWorkerIStudentIWorker。我希望这有助于或给您一个关于如何创建您的个人解决方案的想法。

票数 2
EN

Stack Overflow用户

发布于 2018-05-25 13:49:54

学生和工人都将是类人的子类。人将具有共同的属性(姓名和姓氏)。学生有学习成绩,工人有工资。

这就是用UML表示继承的方法:

您有一个超类和派生类。由于您的超类是抽象的,因此它将有没有实现的声明的方法,因此您将在类Student和Worker中实现它们(如果有必要的话)。

如果您有另一个班的学生-工人,它将继承从学生和工人。所以会是这样的:

A是抽象类的人,B和C分别是学生和工人,D是StudentWorker。StudentWorker将继承“学生”和“工作人员”的属性。

票数 1
EN

Stack Overflow用户

发布于 2018-06-05 03:12:28

这可能是你练习的答案,也可能不是答案。如果我在现实世界中有这些要求,我会重构它们。(当然,在现实世界中,我也会对进一步的改进和细节有很多疑问。)现实世界的情况是(我们可以假设),我们所处理的人总是有一个名字和姓氏。由于当person专门化为子类时,名称和姓氏不会改变(我们也可以假定),因此没有理由提供在子类中以不同方式实现它们的方法。因此,没有理由使person类抽象,因为这就是为什么要创建抽象类。

在这种情况下,聚合(一个类“有”其他类)比继承(子类“是”超类)更有意义。因此,我会以这样的方式重组这些要求:

个人:姓名,姓学生:学校,职系工人:工资

Person类可能“有”零到一个学生类。Person类可能“有”零到一个工作类。

这也意味着,通过要求人是抽象的,一个人必须是一个学生,一个工人,或者两者兼而有之。这可以由两个类之间的or约束指定。

下面是一个图表:

Person类与学生类和工人类都有总体关系。一个人班可能有零到一个学生班。一个人类也可能有零到一个工作类。{or}约束进一步指定,必须有一个学生或工人,或每一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50530616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档