考虑我有一个游戏创建框架,其中有一个名为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类并覆盖虚拟方法?
答案 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方法,原因如下:
正如其他人所说,这取决于课程的目的,我根据它是一个“游戏”类这一事实做出假设。使用触发事件的虚拟方法,没有理由不能同时实现这两者。这将允许大量更新代码集中定位,并允许元素根据需要订阅更新事件。
当我自己处理同样的问题时,我通常会采用虚方法,但为了方便和控制的目的,我已将更新分解为多个部分。