1

たとえばforeachループで、C#でマーカーインターフェイスをローカルに作成できるかどうか疑問に思っています。

HandleInputメソッドとUpdateメソッドを呼び出す必要のあるゲームコンポーネントがあるとします。メソッドは、対応するインターフェイスIUpdateableとIInputHandlerでそれぞれ定義されています。もちろん、次のような通常のforeachループを実行することもできます。

foreach (var component in Components)
        {
            if (component.Enabled)
                component.Update(gameTime);

            if (component.Litsening)
                component.HandleInput(gameTime, InputManager);
        }

ただし、反復変数のタイプがIUpdateableとIInputHandlerの両方で構成される一時的なマーカーインターフェイスであることを指定する方法があれば、非常に便利です。

foreach ((IInputHandler, IUpdateable) component in Components)
        {
            if (component.Enabled)
                component.Update(gameTime);

            if (component.Litsening)
                component.HandleInput(gameTime, InputManager);
        }

これは可能でしょうか、そしてそれは望ましいでしょうか?個人的にはエレガントだと思います。//ありがとう、フィリップシールド

4

3 に答える 3

4

なぜだめですか:

foreach (var component in Components.OfType<IUpdateable>())        
  if (component.Enabled)
    component.Update(gameTime);

foreach (var component in Components.OfType<IInputHandler>())
  if (component.Litsening)
    component.HandleInput(gameTime, InputManager);
于 2012-02-28T08:54:39.473 に答える
1

C# では、この種の構成は許可されていません。一時的な匿名インターフェイスを作成できたとしても、C# は厳密に型指定された言語であることを忘れないでください。したがって、この IComposite インターフェイスが存在する場合、実際のコンポーネント タイプはそれを実装しません。UpdateableComponent は IComposite の半分のみを実装し、ListeningComponent は残りの半分のみを実装します。

コンポーネントが常に両方のインターフェースを実装するシナリオについて話している場合 - その場合、匿名のオンザフライ構造ではなく、これらの両方を単一の複合全体に拡張する 3 番目のインターフェースを作成する必要があります。

public interface IGameComponent : IUpdateable, IInputHandler
{ }

C# はインターフェイスの多重継承をサポートしているため、コンパイル時にこれらのコンポジットを作成できます。

于 2012-02-28T09:20:40.040 に答える
0

どうですか

var componentsWeDesire = Components.Where(c => typeof(IInputHandler).IsAssignableFrom(c.GetType()) 
                                               || typeof(IUpdateable).IsAssignableFrom(c.GetType());

foreach(var component in componentsWeDesire)
{
    // ...
}
于 2012-02-28T08:58:11.723 に答える