【发布时间】:2009-12-16 11:31:03
【问题描述】:
我正在创建一个小游戏。引擎将有许多 GUI 可以订阅的事件。这些事件是:
- 选球
- 球取消选择
- 球已移动
- 球已移除
如果我只有一种类型的球,这一切都很好,但是有 X 种类型的球。它们都派生自一个抽象 Ball 类。
每种球类型都有自己的动作,当该事件发生时会发生这些动作。他们都需要将不同的信息传递回 GUI。例如我有这两种球(这里有更多只是减少信息量)。
- 弹跳球
- 球爆炸
BallBouncing 需要告诉 GUI 它可能已经移动到了哪里,因此只需传回有关它自己的信息。
另一方面,BallExploding 会摧毁周围的球。所以它需要说出它是哪个球以及它摧毁的所有球。
这两种类型的球都可以从同一个事件中触发,但具有不同的事件参数。我可以包含一个值字典,但这并不像为每种类型都有一个自定义事件参数那样明确。
我还认为,如果我创建一个自定义事件 args,其中包含所涉及的球,然后为每种球类型从该事件继承,我可以将事件 args 回滚。
public abstract class BallBaseEventArgs : EventArgs
{
public Ball ball;
}
public class BallExplodingEventArgs : BallBaseEventArgs
{
public IList<Ball> explodedBalls;
}
因此,在 GUI 事件处理程序中,它会通过知道所使用的球类型来投射事件 args。我也不太喜欢这种解决方案,因为它感觉很脏而且绑得太紧。
所以我想我想问有没有人有建议,想法如何解决这种情况。
谢谢
乔恩
编辑
好的,所以我想我会尝试再解释一下我的结构,以澄清并了解它需要我们做什么:
我有一个 Objects DLL,它有 Board 和 Ball 的接口,它有两个 Enum,一个用于 board 类型,一个用于 Ball 类型(这主要用于工厂知道要创建哪种类型的对象) . DLL 还具有 Ball 类和 Board 类的各种实现。
抽象的 Ball 类包含诸如颜色、它的 X 和 Y 坐标、被选中和 BallType 枚举等信息。它有几个方法,Clone()(来自 ICloneable)和 CompareTo(带有 Equals 和哈希值位)。
我有一个实例管理器 DLL,它有一个单例对象,用于控制对球的棋盘和游戏配置数据的访问。该 DLL 还包含 BallFactory 和 boardFactory(不确定这些是否应该包含在 Objects DLL 中,原因是它们不是可以说的对象,不确定这是否是一个很好的做法)。
然后我有引擎 DLL。这涉及游戏的所有逻辑。如何创建板和球,为什么创建它们以及如何使用它们。 Ball 和 Board 类有一个 LogicFactory(所有这些工厂都使用 BallTypes 和 BoardTypes Enum 来决定使用哪个实现)。
逻辑类决定棋盘如何移动球并调用球的动作方法:
- 选球
- 球取消选择
- 球已移动
- 球已移除
在 Ball Logic 类中。
我没有将所有逻辑都放在它们本身的对象中的原因是我认为逻辑和功能应该与仅存储有关它的数据的对象分开(这可能是完全错误的)。 BallLogic bass 类中包含有关 Ball 如何移动/动作的大部分功能,每个派生类决定它调用什么(所有方法都是虚拟的,因此如果需要也可以更改)。
感谢您的所有意见,它真的很受欢迎。我这样做是为了好玩,但主要是为了了解开发不同类型应用程序的正确(和错误)方法。
【问题讨论】:
-
这意味着您使用 BallTypes 层次结构仅用于继承属性并且不会覆盖操作。由于弹跳球不能爆炸,爆炸球不能弹跳,这意味着它们的很多属性也不同......那么你在抽象类中保留了哪些信息?顺便说一句,如果 Balls 可以属于一个层次结构,那么为什么不能有 event args 呢?在这个例子中,专业化并不好,因为如果你需要再添加一种类型怎么办。你会做什么以及如何让它报告画布的更新……通过添加新代码对吗?