为什么我们使用无成员接口?

时间:2009-03-17 07:37:30

标签: c# .net oop interface

编写没有成员的界面有什么意义?

INamingContainer是.NET Framework中的一个示例。它在MSDN中描述为:

  

标识容器控件   在a中创建一个新的ID命名空间   页面对象的控件层次结构。这个   只是一个标记界面。

它是否只用于这种块:

if (myControl is INamingContainer)
{
    // do something
}

还有其他优点吗?

编辑:它被称为Marker Interface Pattern(感谢Preet)

4 个答案:

答案 0 :(得分:10)

无成员接口用于在C#中提供类似mixin的功能。所以给出了A类:

class A : B { ... }

您可以通过定义接口IStuff来为其提供额外的功能(a-la multiple inheritance):

interface IStuff {}

然后在A:'实施'它:

class A : B, IStuff { ... }

然后添加额外功能

class Methods {
  public static void Something(this IStuff stuff) {
    // some functionality here
  }
}

答案 1 :(得分:8)

这是为了确保您可以将对象集合视为相同类型,然后对该类型执行某些操作(您知道它必须从对象继承)。

将其视为属性。这是元数据。

您还可能希望对已知类型(例如System.Web.UI.Control)执行操作,但只有在类型继承自某个接口(例如INamingContainer)时才执行该操作。

foreach(var ctrl in this.Controls)
{
    if (ctrl is INamingContainer)
    {
        // Do something on the control
    }
}

答案 2 :(得分:8)

它是一个标记界面。它可以用来装饰类型,这样你就可以在运行时找出它的类型是正确的而不使用反射。我们使用它来确保被调用者中的泛型类型是正确的。

答案 3 :(得分:3)

混淆认为鸭子打字很酷的pythonistas。