编写没有成员的界面有什么意义?
INamingContainer是.NET Framework中的一个示例。它在MSDN中描述为:
标识容器控件 在a中创建一个新的ID命名空间 页面对象的控件层次结构。这个 只是一个标记界面。
它是否只用于这种块:
if (myControl is INamingContainer)
{
// do something
}
还有其他优点吗?
编辑:它被称为Marker Interface Pattern(感谢Preet)
答案 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。