Action <t> vs虚方法</t>

时间:2012-06-20 15:18:34

标签: c# .net lambda virtual

考虑我有一个游戏创建框架,其中有一个名为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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我宁愿提出事件而不是Action<T>。这是.NET中的常见模式:

public class Game 
{
    public event EventHandler<SomeEventArgs> Update;
    protected virtual void OnUpdate(float mFrameTime) { // invoke event here }
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

  1. 它将您的所有更新逻辑保留在一个位置。
  2. 它允许您轻松监控更新操作的顺序。
  3. 正如其他人所说,这取决于课程的目的,我根据它是一个“游戏”类这一事实做出假设。使用触发事件的虚拟方法,没有理由不能同时实现这两者。这将允许大量更新代码集中定位,并允许元素根据需要订阅更新事件。

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