【问题标题】:Java UML Student Worker project multiple inheritanceJava UML Student Worker 项目多重继承
【发布时间】:2018-05-25 13:43:59
【问题描述】:

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

  • Person 类(抽象)
  • 学生(姓名、姓氏、学校、年级)
  • 工人(姓名,姓氏,薪水)扩展人

学生可以是工人。工人也可以是学生。我将如何实现这一目标?

这是我的解决方案,但我知道它效率不高:

【问题讨论】:

  • 到目前为止你的想法是什么?
  • 请编辑您的问题并包含您的方法,而不是链接到云。谢谢!
  • 我猜学生可以是工人。工人也可以是学生。没有意义。这意味着不可能的相互继承。
  • 这在Java中是不可能的,但在C++中却是……这是一个独立于特定编程语言的问题,至少标签只是说uml、diagram和class-diagram。

标签: uml diagram class-diagram


【解决方案1】:

可能的解决方案如下:

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

首次更新

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

第二次更新

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

请注意,您仍然需要 3 节课。 StudentWorker 分别实现了两个接口,StudentWorker 实现了所有三个接口。这使得所有三个类都成为PersonStudentIStudentWorkerIWorkerStudentWorkerIStudentIWorker。我希望这有助于或让您了解如何创建您的个人解决方案。

【讨论】:

  • 但是 studentworker 应该是从 student 和 worker 继承的属性和方法。在这个解决方案中,studentworker 是独立于 student 和 worker 的第三类。编辑:在这种情况下,您不尊重政治主义。
  • 基本上你会得到与@Ouissal 相同的答案。
  • 基本上你是对的,但我的回答直接回答了这个问题,而不是就如何设计 UML 给出一般性建议。
  • 在 Java 语言中这是不可能的,因为 studentworker 继承自两个类。我错了吗?
  • 你是对的,在 Java 中是不可能的。为什么你没有用额外的 Java 标记标记你的问题?在 C++ 中,您可以进行 diamond 继承。
【解决方案2】:

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

这是在 UML 中表示继承的方式:

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

如果您有另一个班级 student-worker,它将继承自 student 和 worker。所以它会是这样的:

A 是你的抽象类 Person,B 和 C 分别是 Student 和 Worker,而 D 是 StudentWorker。 StudentWorker 将继承 Student 和 Worker 的属性。

【讨论】:

  • drive.google.com/open?id=1RhKAAS9ONkbzxZiZ4RCjxUaGomdOf18V 这是我的想法。但是 studenteoperaio (studentworker) 不带属性“salary”和“school grades”(在意大利语中的 salario 和 voti)
  • 我看不到那个文件,我没有读取权限。学生工作者将从学生和工作者两个类继承,请参阅此答案stackoverflow.com/questions/3541110/…
  • 现在可以看到文件了吗?
  • @Ouissal 很好的答案,虽然比我的更笼统。您真的知道学习和注销之间的区别,并且希望提问者成为学习者。
  • 谢谢@deHaar
【解决方案3】:

这可能是也可能不是您练习的答案。如果我在现实世界中得到这些要求,我会重构它们。 (当然,在现实世界中,我也会有很多关于进一步改进和细节的问题。)现实世界的情况是(我们可以假设)我们正在与总是有名字和姓氏的人打交道。由于当人被专门化为子类时,名字和姓氏不会改变(我们也可以假设),所以没有理由提供一种在子类中以不同方式实现它们的方法。因此没有理由将 person 类抽象化,因为这就是你创建抽象类的原因。

这也是聚合(一个类“拥有”其他类)比继承(子类“是”超类)更有意义的情况。所以我会以这种方式重组需求:

人物:姓名,姓氏 学生:学校,年级 工人:薪水

Person 类可能“有”零到一个 Student 类。 Person 类可能“拥有”零到一个 Worker 类。

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

这是一个图表:

Person 类与学生类和工人类具有聚合关系。一个人班可能有零到一个学生班。一个人班也可能有零到一个工人班。 {or} 约束进一步指定必须有学生或工人之一,或两者之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2012-04-15
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多