我有以下类图。只是寻找一些关于我如何处理这个考试问题的指导,因为我不确定我是否正确。我没有解决方案,希望有经验的人能给出意见。
任务1:添加名为MonsterEater
的子类。此类的对象类似于PieEaters
,但此外MonsterEater
有一个名为numPieEatersEaten
的属性为integer,方法为eatPieEater
,其签名为一个名为{{1}的参数}类型aGrid
。
由于Grid
与MonsterEater
有很多相同的行为,我决定从PieEater
类继承,同时赋予它额外的行为(属性和方法)
任务2 :添加一个名为PieEater
的子类。此类的对象类似于MagicPie
,但此外Pies
有一个名为MagicPies
的属性,类型为boolean,方法出现并消失,并且没有参数的签名,并且不返回任何内容
我让visible
继承自MagicPie
。给出了属性和方法。
任务3 :覆盖继承层次结构中所有具体类的显示方法。
为此我只是将方法Pie
添加到从基类display()
继承的所有类中。
我还被要求添加一个关联,以便只有GameElement
可以吃MonsterEaters
。(我所做的课程来自MagicPies
)所以我做了{{1}从Pie
到eats
最终任务:列出MonsterEater
和MagicPie
类的所有功能。您生成的UML图是否允许MonsterEater
吃MagicPie
。解释你的答案。
我不确定这个,MonsterEaters
继承自Pies
类可以吃馅饼,但我不确定这是否意味着MonsterEater
可以。我也不完全确定我创建的继承层次是否正确。任何见解/指导将不胜感激。
答案 0 :(得分:0)
任务1:如果允许MonsterEater
也吃Pie,那么你的继承关系似乎是可以接受的。我还要在MonsterEater
到PieEater
之间添加关联0..1到0..n。这显然表明了这种继承的含义:MonsterEater
也可以吃另一个MonsterEater
,因为它也是PieEater
。
任务2:继承是有道理的,直观地说,MagicPie
是一种特殊的Pie
。但这种继承的后果是,PieEater
也可以吃MagicPie
(见下文)
任务3:显示正常。好的附加关联。但这里有一个陷阱。由于MagicPie
是Pie
,PieEater
也可以吃MagicPie
。因此,您必须为PieEater
和Pie
之间的现有关联添加约束,例如:{ Pie shall not be a MagicPie }
任务4:有关营养,请参阅上文。你所做的遗产似乎是合理的。指令" 的措辞就像......但另外...... "强烈建议继承。只有当MonsterEater
不允许吃Pie
时,我才会严肃质疑这种继承。这并没有明确禁止。
答案 1 :(得分:-1)
我不会让MonsterEater从PieEater继承,如果它不吃馅饼,它们都有吃/走/转方法的事实可能意味着他们应该实现几个新的接口:IEater,IWalker。 / p>
从Pie继承的MagicPie更有意义,因为它似乎是普通Pie的扩展。
根据您拥有的UML工具,您可能必须指定display()是一个覆盖。
最后一个问题,重新连接到我的第一个观察,它是一个重新发生的问题,你可以两种方式做,如果没有指定,我不会假设怪物食者可以吃一个馅饼也是。
编辑:如果允许您使用多重继承,您也可以使用类而不是Eater / Walker的接口。