我正在查看nServiceBus并来到这个接口
namespace NServiceBus
{
public interface IMessage
{
}
}
空接口有什么用?
通常它是为了表示类的使用情况。您可以实现 IMessage 来表明您的类是一条消息。然后,其他代码可以使用反射来查看您的对象是否旨在用作消息并采取相应的操作。
这是在 Java 有注释之前就经常使用的东西。在 .Net 中,使用属性来实现此目的更清晰。
@Stimpy77 谢谢!我没有那样想过。 我希望您允许我以更通用的方式重新表述您的评论。
必须在运行时使用反射检查注释和属性。可以使用编译器中的类型系统在编译时检查空接口。这在运行时根本不会带来任何开销,因此速度更快。
也称为标记接口。
在java中
Serializable
就是一个完美的例子。它没有定义任何方法,但“实现”它的每个类都必须确保它确实是可序列化的,并且不包含对无法序列化的事物的引用,例如数据库连接、打开文件等。
在 Java 中,空接口通常用于“标记”类 - 如今通常使用注释。
这只是向类添加一些元数据的一种方式,表示“该类适合
<this>
类型的使用”,即使不涉及公共成员。
通常它与属性类似。使用属性优于空接口(至少 FxCop 知道)。然而 .NET 本身使用了其中一些接口,例如
IRequiresSessionState
和 IReadOnlySessionState
。我认为当您使用使元数据查找使用接口的属性时,元数据查找会出现性能损失。
空接口仅充当数据类型的占位符,而无需在其接口行为中更好地指定。
在Java中,接口扩展机制就是一个很好的使用例子。例如,假设我们有以下内容
interface one {}
interface two {}
interface three extends one, two {}
接口三将继承“一”和“二”的行为,所以
class four implements three { ... }
必须指定两种方法,类型为“三”。
从上面的例子中可以看到,空接口也可以看作是多重继承的一个点(Java中不允许)。
希望这有助于澄清进一步的观点。
它们被称为“标记接口”,旨在向标记类的实例发出信号。
例如......在 C++ 中,一种常见的做法是标记为“ICollectible”对象,以便它们可以存储在通用非类型集合中。
所以就像有人说的那样,他们要发出一些对象支持的行为信号,例如收集、序列化的能力等。
空接口用于记录实现给定接口的类具有特定行为
例如在java中,Java中的
Cloneable
接口是一个空接口。当一个类实现 Cloneable
接口时,您知道可以在其上调用 run clone()
。
过去一年一直与 NServiceBus 合作。虽然我不会代表Udi Dahan,但我的理解是这个界面确实主要用作标记。
不过我建议你问问那个人本人,他是否想过把这个留到将来扩展。我的赌注是否定的,因为口头禅似乎是让消息保持非常简单或至少与平台无关。
其他人很好地回答了空接口的更一般原因。
我想说它用于“未来”参考或者如果你想共享一些对象,这意味着你可以有 10 个类,每个类都实现这个接口。
并将它们发送到一个函数来处理它们,但如果界面是空的,我会说它只是“预”工作。
空接口用于标记类,在运行时可以使用接口进行类型检查。
例如 Java 编程语言中标记接口的一个应用是 Serialized 接口。类实现此接口以指示其非瞬态数据成员可以写入 ObjectOutputStream。 ObjectOutputStream 私有方法 writeObject() 包含一系列用于确定可写性的 instanceof 测试,其中一个测试寻找 Serialized 接口。如果这些测试中的任何一个失败,该方法都会抛出 NotSerializedException。
空接口可用于对特定用途下的类进行分类。 (标记界面)
示例:数据库实体
public interface IEntity {
}
public class Question implements IEntity {
// Implementation Goes Here
}
public class Answer implements IEntity {
// Implementation Goes Here
}
例如,如果您将使用通用存储库(例如IEntityRepository),使用通用约束,您可以防止开发人员发送未实现 IEntity 接口的类。