此类是应该直接从基类还是从子类继承

时间:2016-05-07 20:28:18

标签: class inheritance uml

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

enter image description here

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

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

  • 任务2 :添加一个名为PieEater的子类。此类的对象类似于MagicPie,但此外Pies有一个名为MagicPies的属性,类型为boolean,方法出现并消失,并且没有参数的签名,并且不返回任何内容

    我让visible继承自MagicPie。给出了属性和方法。

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

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

    我还被要求添加一个关联,以便只有GameElement可以吃MonsterEaters。(我所做的课程来自MagicPies)所以我做了{{1}从Pieeats

  • 的关联
  • 最终任务:列出MonsterEaterMagicPie类的所有功能。您生成的UML图是否允许MonsterEaterMagicPie。解释你的答案。

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

2 个答案:

答案 0 :(得分:0)

任务1:如果允许MonsterEater也吃Pie,那么你的继承关系似乎是可以接受的。我还要在MonsterEaterPieEater之间添加关联0..1到0..n。这显然表明了这种继承的含义:MonsterEater也可以吃另一个MonsterEater,因为它也是PieEater

任务2:继承是有道理的,直观地说,MagicPie是一种特殊的Pie。但这种继承的后果是,PieEater也可以吃MagicPie(见下文)

任务3:显示正常。好的附加关联。但这里有一个陷阱。由于MagicPiePiePieEater也可以吃MagicPie。因此,您必须为PieEaterPie之间的现有关联添加约束,例如:{ Pie shall not be a MagicPie }

任务4:有关营养,请参阅上文。你所做的遗产似乎是合理的。指令" 的措辞就像......但另外...... "强烈建议继承。只有当MonsterEater不允许吃Pie时,我才会严肃质疑这种继承。这并没有明确禁止。

答案 1 :(得分:-1)

我不会让MonsterEater从PieEater继承,如果它不吃馅饼,它们都有吃/走/转方法的事实可能意味着他们应该实现几个新的接口:IEater,IWalker。 / p>

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

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

最后一个问题,重新连接到我的第一个观察,它是一个重新发生的问题,你可以两种方式做,如果没有指定,我不会假设怪物食者可以吃一个馅饼也是。

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