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. すべての更新ロジックを1か所に保持します。
  2. これにより、更新アクションの順序を簡単に監視できます。

他の人が言っているように、それはクラスの目的に依存します、そして私はそれが「ゲーム」クラスであるという事実に基づいて仮定をしています。イベントをトリガーする仮想メソッドを使用して、両方を実装できなかった理由はありません。これにより、更新コードの大部分を中央に配置し、必要に応じて要素が更新イベントをサブスクライブするオプションを使用できるようになります。

私自身が同じ問題に取り組んだとき、私は通常、仮想メソッドアプローチを採用しましたが、利便性と制御の目的で更新を複数のセクションに分割しました。

于 2012-06-20T15:26:45.963 に答える