2012-02-28 3 views
1

Мне интересно, можно ли локально создавать интерфейсы маркеров в C#, например, в цикле foreach.Интерфейс анонимного маркера в C#?

Учитывайте, что у нас есть игровые компоненты, которые должны иметь методы HandleInput и Update-methods. Методы определены в соответствующих интерфейсах, IUpdateable & IInputHandler соответственно. Мы могли бы, конечно, сделать обычный цикл Еогеаспа так:

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

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

Однако, было бы очень здорово, если бы был способ указания, что тип iterationvariables носил временный интерфейс маркеров, который построен из как IUpdateable & IInputHandler:

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

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

бы это было возможно, и было бы предпочтительнее? Лично я считаю его элегантным. // Спасибо, Филипп Щит

+0

Какая польза/значение имеет второй случай? – 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 => Update (gametime));' –

+0

@Avner I ' d сказать, что это вопрос стиля кодирования и удобочитаемости. – 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 реализует только вторую половину.

Если вы говорите о сценарии, в котором ваши компоненты всегда реализуют оба интерфейса - ну, в этом случае вы должны создать третий интерфейс, а не анонимную конструкцию «на лету», которая расширяет их оба до одного композитное целое:

public interface IGameComponent : IUpdateable, IInputHandler 
{ } 

C# поддерживает множественное наследование для интерфейсов, поэтому вы можете создавать эти композиты во время компиляции.

Смежные вопросы