【问题标题】:Anonymous Marker Interface in C#?C# 中的匿名标记接口?
【发布时间】:2012-03-17 17:44:58
【问题描述】:

我想知道是否可以在 C# 中本地创建标记接口,例如在 foreach 循环中。

考虑我们的游戏组件应该调用它们的 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);
        }

这可能吗,会更好吗?我个人认为它很优雅。 // 谢谢,菲利普·希尔德

【问题讨论】:

  • 第二种情况的好处/意义是什么?
  • 你想解决什么问题?

标签: c# marker-interfaces


【解决方案1】:

为什么不:

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

【讨论】:

  • 我什至会将其微调为:Components.OfType&lt;IUpdateable&gt;().Where(c=&gt;c.Enabled).ToList().ForEach(c=&gt;Update(gametime));
  • @Avner 我想说这是编码风格和可读性的问题。
【解决方案2】:

C# 不允许这种结构。即使它确实允许您创建一个临时的匿名接口,请记住 C# 是一种强类型语言。因此,如果存在此 IComposite 接口,则您的实际组件类型不会实现它。 UpdateableComponent 只实现了 IComposite 的一半,而您的 ListeningComponent 只实现了另一半。

如果您谈论的是组件始终实现两个接口的场景 - 那么,在这种情况下,您应该创建第三个接口 - 而不是匿名的动态构造 - 将这两个接口扩展为单个复合整体:

public interface IGameComponent : IUpdateable, IInputHandler
{ }

C# 支持接口的多重继承,因此您可以在编译时创建这些组合。

【讨论】:

    【解决方案3】:

    怎么样

    var componentsWeDesire = Components.Where(c => typeof(IInputHandler).IsAssignableFrom(c.GetType()) 
                                                   || typeof(IUpdateable).IsAssignableFrom(c.GetType());
    
    foreach(var component in componentsWeDesire)
    {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多