【问题标题】:Why do we use memberless interface?为什么我们使用无成员接口?
【发布时间】:2010-10-13 18:58:34
【问题描述】:

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

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

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

它只用于这种块吗:

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

或者它还有其他优点吗?

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

【问题讨论】:

    标签: c# .net oop interface


    【解决方案1】:

    为了迷惑那些认为鸭式打字很酷的 Python 爱好者。

    【讨论】:

      【解决方案2】:

      它是一个标记界面。它可用于装饰类型,以便您可以在运行时发现类型是否正确,而无需使用反射。我们使用它来确保被调用者中的泛型类型是正确的。

      【讨论】:

        【解决方案3】:

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

        class A : B { ... }
        

        你可以通过定义一个接口 IStuff 来赋予它额外的功能(a-la 多重继承):

        interface IStuff {}
        

        然后在 A 中“实现”它:

        class A : B, IStuff { ... }
        

        然后添加额外的功能

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

        【讨论】:

        • 非常好主意。以前没有看到这种可能性,但现在会寻找机会。
        • 我不明白这有什么用。如果该扩展方法不是通用的,那么如果不进行强制转换,您将无能为力。如果你让它通用,你就不需要空接口。
        【解决方案4】:

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

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

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

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

        【讨论】:

        • 事实上,这就是我在 C++ 中应用“属性”的方式,因为你没有反射但你有 RTTI。
        • 好点——近 8 年没学过 c++ 我忘记了这样的事情。
        • 这似乎不是问题的答案。他询问了无成员接口——没有通用操作或属性的接口。它被接受了,尽管...
        • 该接口没有通用操作,但您仍然可以执行该接口的ON种通用操作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        • 2020-12-02
        • 2019-09-17
        相关资源
        最近更新 更多