写一个没有成员的接口有什么意义?
INamingContainer是.NET Framework中的一个例子。在MSDN中描述为:
标识一个容器控件,在Page对象的控件层次结构中创建一个新的ID命名空间。这只是一个标记接口。
它仅用于这种类型的块吗:
if (myControl is INamingContainer)
{
// do something
}
或者它还有其他的优点吗?
编辑:它被称为 标记接口模式(感谢 Preet)。
无成员接口在C#中被用来提供类似于mixin的能力。因此,考虑一个类A:
class A : B { ... }
你可以通过定义一个接口IStuff来为它提供额外的功能(类似于多重继承):
interface IStuff {}
然后在A中“实现”它:
class A : B, IStuff { ... }
然后添加额外的特性
class Methods {
public static void Something(this IStuff stuff) {
// some functionality here
}
}
这是为了确保您可以将对象集合视为相同类型并对该类型执行一些操作(您知道它必须从object继承)。
就像属性一样,它是类型元数据。
您可能还想对已知类型(例如System.Web.UI.Control)执行操作,但仅在该类型从特定接口(例如INamingContainer)继承时执行该操作。
foreach(var ctrl in this.Controls)
{
if (ctrl is INamingContainer)
{
// Do something on the control
}
}
它是一个标记接口。可以用来修饰类型,从而在运行时无需使用反射就能确定类型是否正确。我们使用它来确保调用方中通用类型的正确性。