我不久前发布了一个我正在制作的应用程序的类图。得到一些有用的提示,然后开始工作。设计肯定很难!无论如何,我制作了2.0版本,但遇到了其他问题。也许有人可以就我的班级图表提供指导,评论或建议: - )
首先,我在SomeInterface中将'Speed'作为 Sprite 抽象类的一部分。经过考虑,我认为这不是放“速度”的最佳位置。一个不太好的事情是,我无法给界面一个正确的名称,并且我不知道在属性或操作隔间中放置“速度”的位置,因为它是一个属性...
每个物体(子弹,入侵者,船只)按照自己的速度移动,所以我将“速度”放入界面。所有对象都继承自超类 Sprite ,并且只覆盖Update()方法。 Bullet 抽象类对从 Sprite 获取的Update方法没有任何作用,只是在那里显示它从那里得到它。我不知道这是否是正确的方法,或者我应该将其删除,只在覆盖它的类中显示它?
我不知道如何处理的另一个问题是入侵者完成的动画。我有以下属性:SheetSize,FrameSize和CurrentFrame。 Sheet包含外星人图片(如翻书),FrameSize仅用于选择工作表上的框架,而CurrentFrame ...包含当前框架。由于Ship和Bullet没有动画,因此这些属性对它们没用。把它们放在哪里?
最后,我没有在哪里实施IBulletBehavior。首先,我有每个子弹行为实现IBulletBehavior,但切换到让抽象的Bullet类实现它。是否有任何规则说明要采取哪一种?
答案 0 :(得分:0)
抽象类描述了类是什么。您不必实现方法调用的实际功能,因此您不必在Bullet类中实现有关项目符号的所有内容。此外,接口非常适合描述您的类能力。抽象类显示了什么(Is-A)和接口描述了类可以做什么。
(我不知道这只是一个课程/界面练习还是你实际上正在制作一个游戏。如果它只是一个练习,你可以跳到下一段)。对于你的SomeInterFace界面,如IMoveable或IMobile这样的东西呢?在这里,您还可以查看数学向量。界面不应暴露Speed,除非您希望实现它的对象之外的对象与Speed交互。相反,它应该是Move()和/或DetectCollision()的行。外部互动进入界面 - 你告诉全世界你可以做什么。
最后,什么是IBulletBehavior以及精灵为什么要关心它?这回过头来描述你的课程可以做什么。子弹是精灵,但实现了IBulletBehavior(无论是什么)。你想让所有的精灵都实现IBulletBehavior吗?当你想要一块摇滚或其他东西只是坐在球员的方式时会发生什么?您现在将拥有一个不实现指定行为的对象。