【问题标题】:What is an empty interface used for空接口是做什么用的
【发布时间】:2010-09-27 16:43:19
【问题描述】:

我在看nServiceBus,过来这个界面

namespace NServiceBus
{
    public interface IMessage
    {
    }
}

空接口有什么用?

【问题讨论】:

    标签: interface


    【解决方案1】:

    通常是用来表示一个类的使用情况。您可以实现 IMessage 以表明您的类是一条消息。然后其他代码可以使用反射来查看您的对象是否打算用作消息并采取相应的行动。

    这是在 Java 中有注解之前大量使用的东西。在 .Net 中,为此使用属性更简洁。


    @Stimpy77 谢谢!我没有那样想。 希望您允许我以更笼统的方式重新表述您的评论。

    注解和属性必须在运行时使用反射进行检查。可以在编译时使用编译器中的类型系统检查空接口。这根本不会在运行时带来任何开销,因此速度更快。

    【讨论】:

    • 警惕.NET注释,它需要反射才能使用属性,速度较慢并且不支持“X is Y”和“X as Y”语义。您也可以在 .NET 中使用空接口。
    • "这是在 Java 中使用很多的东西,在它们有注释之前。"你能澄清一下吗?我在想你的意思是有一个注释可以用来实现相同的目标
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      在 java 中 Serializable 是一个完美的例子。它没有定义任何方法,但它必须确保“实现”每个类,它确实是可序列化的,并且不包含对无法序列化的事物的引用,例如数据库连接、打开的文件等。

      【讨论】:

      • 你最好添加serialVersionUID
      • 如果 Serializable 为空...如何执行?
      【解决方案4】:

      在 Java 中,空接口通常用于“标记”类 - 现在通常使用注释。

      这只是在类中添加一点元数据的一种方式,说“这个类适合<this> 类型的使用”,即使不涉及普通成员。

      【讨论】:

      • 嗯,听起来要么是对概念的误用,要么是一个聪明的想法。可能两者都有;-)。
      • 在注解之前,还是有些合理的。现在没有充分的理由使用它,IMO。
      【解决方案5】:

      通常它类似于属性。使用属性比空接口更受欢迎(至少在 FxCop 知道的情况下)。但是 .NET 本身使用其中一些接口,例如 IRequiresSessionStateIReadOnlySessionState。我认为当您使用使它们使用接口的属性时,元数据查找会降低性能。

      【讨论】:

      • 标记接口和属性之间的主要区别在于,实现标记接口的类将所有后代类都提交给这样做,而包含属性的类对其后代没有这样的要求。如果能够定义不做其基类所做的事情的类很重要,请使用属性。如果引用的接收者需要依赖任何传递的支持引用类型所具有的任何特性的实例,请使用标记接口。
      【解决方案6】:

      空接口仅充当其接口行为中没有更好指定的数据类型的占位符。

      在Java 中,接口扩展机制代表了一个很好的使用示例。例如,假设我们有以下

      interface one {}
      interface two {}
      
      interface three extends one, two {}
      

      接口三会继承‘一’和‘二’的行为,以此类推

      class four implements three { ... }
      

      必须指定两种方法,属于“三”类型。

      如你所见,从上面的例子中,空接口也可以看作是多重继承的一个点(在Java中是不允许的)。

      希望这有助于进一步澄清观点。

      【讨论】:

        【解决方案7】:

        它们被称为“标记接口”,用于标记标记类的实例。

        例如...在 C++ 中,将对象标记为“ICollectible”是一种常见的做法,这样它们就可以存储在通用的非类型化集合中。

        就像有人说的那样,它们是为了表明一些对象支持的行为,比如被收集、序列化等的能力。

        【讨论】:

          【解决方案8】:

          过去一年一直在使用 NServiceBus。虽然我不代表Udi Dahan,但我的理解是这个界面确实主要用作标记

          虽然我建议你问问那个人自己,他是否有想过留下这个以供将来扩展。我的赌注是不,因为口头禅似乎是让消息非常简单,或者至少实际上与平台无关。

          其他人对空接口的更一般原因回答得很好。

          【讨论】:

            【解决方案9】:

            我会说它用于“未来”参考,或者如果你想共享一些对象,这意味着你可以有 10 个类,每个类都实现这个接口。

            并将它们发送到一个函数以对其进行处理,但如果接口为空,我会说它只是“pre”-work。

            【讨论】:

              【解决方案10】:

              空接口用于记录实现给定接口的类具有某种行为

              例如,在 Java 中,Cloneable 接口在 Java 中是一个空接口。当一个类实现了Cloneable接口时,你就知道可以调用run the clone()了。

              【讨论】:

                【解决方案11】:

                空接口用于标记类,在运行时可以使用接口进行类型检查。

                例如 来自 Java 编程语言的标记接口的一个应用是 Serializable 接口。类实现此接口以指示其非瞬态数据成员可以写入 ObjectOutputStream。 ObjectOutputStream 私有方法 writeObject() 包含一系列用于确定可写性的 instanceof 测试,其中一个用于查找 Serializable 接口。如果这些测试中的任何一个失败,该方法将抛出 NotSerializableException。

                【讨论】:

                  【解决方案12】:

                  空接口可用于根据特定目的对类进行分类。 (标记界面

                  示例:数据库实体

                  public interface IEntity {
                  
                  }
                  
                  public class Question implements IEntity {
                     // Implementation Goes Here
                  }
                  
                  public class Answer implements IEntity {
                     // Implementation Goes Here
                  }
                  

                  例如,如果您将使用通用存储库(例如 IEntityRepository),使用通用约束,您可以防止开发人员发送未实现 IEntity 接口的类。

                  【讨论】:

                    猜你喜欢
                    • 2010-11-06
                    • 2010-10-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-02-18
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多