【问题标题】:Should I define one subtype which is exactly the same as the supertype我是否应该定义一个与超类型完全相同的子类型
【发布时间】:2015-03-31 04:32:26
【问题描述】:

我有一个 java 作业。它的要求表明有一个称为Module的超类型。它有两个子类型类“必修模块”和“选修模块”。前者继承了超类的所有属性;后者有一个额外的属性,称为部门名称。

我认为必修模块与模块相同。定义一个与超类相同的子类是正确的。每个模块实例必须是强制的或可选的。没有其他类型的模块。我是否应该将 Module 定义为抽象类,因为在决定在实际情况下应该使用什么类时我不想混淆。或者有人可以给我一些提示。

【问题讨论】:

  • Module 是超类型。强制模块扩展了模块,但没有定义自己的方法。选修模块扩展了模块,并且它还具有与之关联的一种特定方法。无需将 Module 定义为抽象类。相应地定义模块并根据要求扩展子类

标签: java inheritance


【解决方案1】:

您的问题似乎有了答案。即使 CompulsoryModule 没有其他属性并且仅扩展模块,您似乎也需要拥有 3 个类。

模块本身可以是抽象的,也可以不是。这取决于您要达到的目标。在某些情况下,您不可能将超类 Module 定义为非抽象类。

例如,如果 Module 有一个您不知道如何实现的方法,除非您使用 CompulsoryModule 或 ElectiveModule,那么您必须将该方法定义为抽象,从而使整个类抽象。

此外,将类抽象化可以防止任何人创建该类的实例,并且只能实例化一个子类。同样,当某些东西没有在 Module 本身中完全定义并且需要特定的子类来理解超类的代码时,就需要这样做。

【讨论】:

    【解决方案2】:

    您应该问的问题是:选修课是必修课吗? 如果是这种情况,那么您可以让 Elective Module 成为 Compulsory Module 的超类。

    多态性在Java中被翻译成关系“is a”

    (在您的作业中,很明显 Module 类应该是抽象的。因为它与 Elective Module 类具有相同的“行为”。)

    【讨论】:

    • 我的意思是选修课和必修课是同一级别的。我徘徊在超类(模块)应该是抽象类还是不是因为模块与强制模块相同。
    • 你应该问这个问题:“是否存在通用模块?”。可能不是,因为就像你说的那样,选修模块与模块具有相同的“行为”。所以我会把它抽象化。
    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2015-04-24
    • 2020-02-16
    • 2021-03-06
    相关资源
    最近更新 更多