什么是用于的空接口

时间:2008-12-19 11:00:34

标签: interface

我正在查看nServiceBus并通过此界面

namespace NServiceBus
{
    public interface IMessage
    {
    }
}

空接口的用途是什么?

12 个答案:

答案 0 :(得分:35)

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

这是Java在注释之前经常使用的东西。在.Net中,使用属性更清晰。


@ Stimpy77谢谢!我没想过那样。 我希望你允许我以更一般的方式改写你的评论。

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

答案 1 :(得分:18)

答案 2 :(得分:10)

在java Serializable中就是一个很好的例子。它没有定义任何方法,但每个“实现”它的类必须确保它实际上是可序列化的,并且不能引用无法序列化的东西,比如数据库连接,打开文件等。

答案 3 :(得分:7)

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

这只是向一个类添加一些元数据的一种方式,即“即使没有普通成员参与此类也适合<this>类使用”。

答案 4 :(得分:2)

通常它与属性类似。使用属性是空接口的首选(至少与FxCop知道的一样多)。但是,.NET本身使用其中一些接口,如IRequiresSessionStateIReadOnlySessionState。我认为当你使用使它们使用接口的属性时,元数据查找会有性能损失。

答案 5 :(得分:2)

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

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

interface one {}
interface two {}

interface three extends one, two {}

接口3将继承'one'和'two'的行为,所以

class four implements three { ... }

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

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

希望这有助于澄清另一种观点。

答案 6 :(得分:1)

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

虽然我建议你问那个男人自己是否有想过将此留待将来延期。我的赌注是否定的,因为口头禅似乎是为了保持信息非常简单或至少实际上与平台无关。

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

答案 7 :(得分:0)

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

让他们发送到一个函数来处理它们,但如果界面是空的,我会说它只是“预先”工作。

答案 8 :(得分:0)

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

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

就像有人说的那样,他们会发出一些支持对象的行为,比如收集,序列化等等。

答案 9 :(得分:0)

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

例如在java中,Java中的Cloneable接口是一个空接口。当一个类实现Cloneable接口时,您知道可以调用它来运行clone()

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

示例:数据库实体

public interface IEntity {

}

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

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

对于实例,如果要使用通用存储库(例如 IEntityRepository ),并且使用通用约束,则可以防止开发人员发送未实现IEntity接口的类。< / p>