1

考虑我有一个游戏创建框架,有一个名为 Game 的基本类。

// Action version
public class Game 
{
    public Action<float> OnUpdate;
    public void Update(float mFrameTime) { OnUpdate.Invoke(mFrameTime); }
}

// Virtual version
public class Game 
{
    public virtual void Update(float mFrameTime) {}
}

哪一个是最好的方法?(设计方面和性能方面)

订阅 OnUpdate 动作(而不是继承 Game 类),还是继承 Game 类并覆盖虚拟方法?

4

4 回答 4

3

这取决于Update通知的目标受众是谁。如果它仅用于派生类,那么virtual方法是一种很好的方法。如果它用于派生类和/或任意消费者,那么事件样式模式是正确的方法。

于 2012-06-20T15:21:14.540 回答
2

我宁愿引发事件也不愿拥有Action<T>. 这是 .NET 中的常见模式:

public class Game 
{
    public event EventHandler<SomeEventArgs> Update;
    protected virtual void OnUpdate(float mFrameTime) { // invoke event here }
}
于 2012-06-20T15:19:50.343 回答
1

这取决于你的框架的其余部分是什么样的,以及你打算用这个类做什么。如果这个类只是提醒其他类该更新了,那么您将需要一个基于事件的系统。如果这是所有游戏派生的基类,那么您可能需要一个覆盖。没有答案是 100% 正确的——这完全取决于你想要用你的设计来完成什么。

于 2012-06-20T15:22:59.213 回答
0

不幸的是,我缺乏知识来回答从性能角度来看哪些选项会更有效,但从设计角度来看,我建议重写 Update 方法,原因如下:

  1. 它将所有更新逻辑保存在一个位置。
  2. 它允许您轻松监控更新操作的顺序。

正如其他人所说,这取决于课程的目的,我基于这是一个“游戏”课程这一事实做出假设。没有理由不能使用触发事件的虚拟方法来实现两者。这将允许集中定位大部分更新代码,并且可以选择元素根据需要订阅更新事件。

当我自己处理相同的问题时,我通常采用虚拟方法方法,尽管为了方便和控制目的,我将更新分解为多个部分。

于 2012-06-20T15:26:45.963 回答