2012-02-28 5 views
1

C#でマーカーインターフェイスをローカルに作成できるかどうかは、たとえばforeachループで考えられます。C#の匿名マーカーインターフェイス?

HandleInputメソッドとUpdateメソッドが呼び出されるべきgamecomponentsがあるとします。これらのメソッドは対応するインタフェースで定義されており、それぞれIUpdateable & IInputHandlerです。 iterationvariablesの種類がで構成され、一時的なマーカーインタフェースであったことを指定する方法があった場合、それは非常に巧妙になり、しかし

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

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

:私たちは、当然のことながら、このような通常のforeachループを行うことができますIUpdateable & IInputHandler両方:

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

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

が、これは可能でしょうし、それが望ましいのでしょうか?個人的に私はそれをエレガントなものと考えています。 //おかげで、フィリップ・シールド

+0

2番目のケースのメリット/意味は何ですか? – Tigran

+0

あなたはどんな問題を解決しようとしていますか? – jgauffin

答えて

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); 
+0

'Components.OfType ().Where(c => c.Enabled).ToList()。ForEach(c =>更新(gametime)); ' –

+0

@Avner I'それはコーディングスタイルと読みやすさの問題だと言います。 – clearpath

0

どの程度

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

foreach(var component in componentsWeDesire) 
{ 
    // ... 
} 
1

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

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

public interface IGameComponent : IUpdateable, IInputHandler 
{ } 

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