【问题标题】:Should this class inherit from directly from the base class or from the subclass这个类应该直接从基类继承还是从子类继承
【发布时间】:2016-09-02 18:23:05
【问题描述】:

我有以下类图。只是寻找一些关于我如何处理这个考试问题的指导,因为我不确定我是否正确。我没有解决方案,希望有经验的人能给出意见。

  • 任务 1: 添加一个名为 MonsterEater 的子类。此类的对象类似于PieEaters,但此外MonsterEater 有一个名为numPieEatersEaten 的整数类型的属性和一个方法eatPieEater,其签名的一个参数名为aGrid,其类型为Grid

    由于MonsterEater 有很多与PieEater 相同的行为,我决定让它继承自PieEater 类,同时赋予它额外的行为(属性和方法)

  • 任务 2:添加一个名为 MagicPie 的子类。此类的对象类似于Pies,但除此之外MagicPies 有一个名为visible 的布尔类型的属性,并且方法出现和消失都带有无参数签名并且什么都不返回

    我让MagicPie 继承自Pie。给它属性和方法。

  • 任务 3:覆盖继承层次结构中所有具体类中的 display 方法。

    为此,我只是将display() 方法添加到从基类GameElement 继承的所有类中。

    我还被要求添加一个关联,以便 MonsterEaters 可以吃 MagicPies。(我创建的类派生自 Pie)所以我已经完成了从 MonsterEater 到 @ 的 eats 关联987654346@

  • 最终任务:列出MonsterEaterMagicPie 类的所有功能。您制作的 UML 图是否允许MonsterEaters 吃掉Pies。解释你的答案。

    我不确定这个,MonsterEater 继承自 PieEater 可以吃馅饼的类,但我不确定这是否意味着 MonsterEater 可以。我也不完全确定我创建的继承层次结构是否正确。任何见解/指导将不胜感激。

【问题讨论】:

    标签: class inheritance uml


    【解决方案1】:

    任务 1: 如果MonsterEater 也被允许吃派,那么你的继承关系似乎可以接受。我还将从 MonsterEater 添加到 PieEater 的关联 0..1 到 0..n。这清楚地表明了这种继承的含义:一个MonsterEater 也可以吃另一个MonsterEater,因为它也是一个PieEater

    任务 2: 继承是有意义的,因为直观上 MagicPie 是某种特殊的 Pie。但是这种继承的结果是,PieEater 也可以吃掉MagicPie(见下文)

    任务 3: 显示正常。确定附加关联。但这里有一个陷阱。因为MagicPiePie,所以PieEater 也可以吃MagicPie。所以你必须在PieEaterPie之间的现有关联中添加一个约束,例如:{ Pie shall not be a MagicPie }

    任务 4:关于营养,见上文。你所做的继承似乎是合理的。指令的措辞“are like ... but 此外...”强烈建议继承。只有MonsterEater不被允许吃Pie,我才会认真质疑这种继承。这并没有明确禁止。

    【讨论】:

    • 谢谢我说 monserEater 也可以吃馅饼,因为 monsterEater 也是 pieEater 是对的吗?我是否必须显示这种关联,或者会通过关联 pieEater 吃馅饼来暗示?它还询问了 monsterEater 和 magicPie 类的特征,它们是什么?
    • @stephenreilly 是的,你是对的。该关联是隐含的,无需显示。对于功能,我会列出类及其父级的功能。
    • 如列出它可以做的所有事情?比如吃馅饼、走路、转身等。
    • @stephenreilly 属性 + 操作 + 关联
    • 如果它不能吃 MagicPie,那么我会使用 NormalPie 类而不依赖运行时检查。
    【解决方案2】:

    如果 MonsterEater 不吃馅饼,我不会让 MonsterEater 继承自 PieEater,事实上它们都有eat/walk/turn 方法,这可能意味着它们应该实现一些新接口:IEater、IWalker。

    从 Pie 继承的 MagicPie 更有意义,因为它似乎是普通 Pie 的扩展。

    根据您拥有的 UML 工具,您可能必须指定 display() 是一个覆盖。

    最后一个问题,重新连接到我的第一个观察,这是一个要求的问题,你可以双向进行,如果没有指定,我不会假设 MonsterEater 也可以吃馅饼。

    编辑:如果您被允许使用多重继承,您也可以使用类而不是 Eater/Walker 的接口。

    【讨论】:

    • 是的,这是有道理的,谢谢。因此,即使 MonsterEater 具有eatpie() 方法,它与 Pie 没有吃关联的事实我可以假设它不能吃馅饼?还有什么特点?它可以做什么?
    • 最后我被要求根据基类、子类和叶类进行标记,我了解如何标记除网格类之外的所有内容。那会是一个基类吗?
    • 这将再次取决于设计,但是,没有任何继承者,它是一个叶类。要被阻止拥有子类,它应该有一个“密封/最终”的原型。但我想现在我想太多关于语言的实现了。
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2011-02-21
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多