2012-06-20 36 views
1

考虑我有一个游戏创建框架,其中有一个叫做游戏的基本类。动作<T> vs虚拟方法

// 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类并覆盖虚拟方法?

+1

仅供参考[tag:XNA]框架使用虚拟方法。我个人相信他们的判断,除非你的用例不同。 :) –

回答

3

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

+0

当然可以将这两个。 – dzendras

2

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

+0

提升事件而不是使用Action的优势究竟是什么? –

+2

@Vee - 活动可以有很多订户。 –

+0

事件是代表(有访问限制)。没有差别。代表也可以有多个订户(试一试:)。设计明智的是,事件通常适用于事件,而普通代表通常用于回调。 [编辑:增加强调事件是代表 - 它们是完全相同的,它是一个别名,在访问时有一些额外的编译器限制 - 如果你愿意,你可以得到添加/删除道具) – payo

1

这取决于你的框架的其余部分是什么样子以及你打算如何处理这个类。如果这个类只是提醒其他类需要更新,那么你就需要一个基于事件的系统。如果这是所有游戏的基类,那么您可能需要重写。没有答案是100%正确的 - 这一切都取决于你想要完成的设计。

0

不幸的是我缺乏足够的知识来回答其中的这些选项将是从性能的角度更加高效,但是从设计的角度来看,我会建议重写更新方法有以下原因:

  1. 它使所有您的更新逻辑在一个地方。
  2. 它允许您轻松地监视更新操作的顺序。

正如其他人所说,这取决于班级的目的,而且我正在根据它是'游戏'类的事实做出假设。没有理由不能同时实现这两种方法,并且会触发一个触发事件的虚拟方法。这将允许大量更新代码集中定位,并且可以根据需要选择元素来订阅更新事件。

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