0

不久前,我发布了我正在制作的应用程序的类图。得到了一些有用的提示并开始工作。设计确实很难!无论如何,我做了一个 2.0 版,但遇到了其他事情。也许有人可以就我的类图提供指点、评论或建议:-)

太空侵略者建筑 V. 2.0

首先,我在 SomeInterface 中有“Speed”作为Sprite抽象类的一部分。经过考虑,我认为这不是放置“速度”的最佳位置。一个不太好的事情是我无法为界面命名,而且我不知道在属性或操作隔间中将“速度”放在哪里,因为它是一个属性......

每个对象(子弹、入侵者、船)都以自己的速度移动,所以我将“速度”放入界面。所有对象都继承自超类Sprite,并且仅覆盖 Update() 方法。Bullet抽象类对从Sprite获得的 Update 方法没有任何作用,它只是显示它是从那里获得的。我不知道这是否是正确的方法,或者我应该把它排除在外,只在覆盖它的类中显示它?

另一个我不知道如何处理的问题是入侵者制作的动画。我得到了以下属性:SheetSize、FrameSize 和 CurrentFrame。工作表包含外星人图片(如翻书),FrameSize 仅用于选择工作表上的帧,而 CurrentFrame ......嗯,保存当前帧。由于 Ship 和 Bullet 没有动画,因此这些属性对它们没有用处。把它们放在哪里?

最后,我没有在哪里实现IBulletBehavior。首先,我让每个子弹行为都实现了 IBulletBehavior,但切换到让抽象 Bullet 类实现它。有没有规定要拿哪一个的规则?

4

1 回答 1

0

抽象类描述了类是什么。您不必实现方法调用的实际功能,因此不必在 Bullet 类中实现有关子弹的所有内容。此外,接口非常适合描述您的类的能力。抽象类显示某物是什么(Is-A),接口描述了类可以做什么。

(我不知道这只是一个课堂/界面练习还是你真的在做一个游戏。如果只是一个练习,你可以跳到下一段)。对于您的 SomeInterFace 界面,像 IMoveable 或 IMobile 这样的东西怎么样?在这里,您还可以查看数学向量。接口不应暴露 Speed,除非您希望实现它的对象之外的对象与 Speed 交互。相反,它应该是类似于 Move () 和/或 DetectCollision () 的东西。外部交互进入界面——你告诉世界你能做什么。

最后,什么是 IBulletBehavior,如果精灵是一个,为什么要关心它?这又回到了描述你的班级可以做什么。子弹是一个精灵,但实现了 IBulletBehavior(不管是什么)。你想让所有的精灵都实现IBulletBehavior吗?当你想要一块石头或其他东西挡住玩家的路时会发生什么?您现在将拥有一个未实现指定行为的对象。

于 2011-02-21T16:10:53.050 回答