2012-06-20 59 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. 它允許您輕鬆地監視更新操作的順序。

正如其他人所說,這取決於班級的目的,而且我正在根據它是'遊戲'類的事實做出假設。沒有理由不能同時實現這兩種方法,並且會觸發一個觸發事件的虛擬方法。這將允許大量更新代碼集中定位,並且可以根據需要選擇元素來訂閱更新事件。

當我自己接近同樣的問題時,我通常會採用虛擬方法,但爲了方便和控制目的,我已將更新分解爲多個部分。