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

Can*_*var 7 .net c# oop interface

编写没有成员的接口有什么意义?

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

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

它只用于这种块:

if (myControl is INamingContainer)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

还是有其他优点吗?

编辑:它被称为标记界面模式(感谢Preet)

Dmi*_*ruk 10

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

class A : B { ... }
Run Code Online (Sandbox Code Playgroud)

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

interface IStuff {}
Run Code Online (Sandbox Code Playgroud)

然后在A中'实施'它:

class A : B, IStuff { ... }
Run Code Online (Sandbox Code Playgroud)

然后添加额外的功能

class Methods {
  public static void Something(this IStuff stuff) {
    // some functionality here
  }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*ker 8

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

把它想象成属性.它是类型元数据.

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

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


Pre*_*gha 8

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