2008-12-19 114 views
31

我找一個空的接口在nServiceBus走了過來這個接口什麼是用於

namespace NServiceBus 
{ 
    public interface IMessage 
    { 
    } 
} 

有什麼用空接口?

回答

29

通常是指示一個類的使用情況。你可以實現IMessage來表示你的課程是一個消息。其他代碼然後可以使用反射來查看您的對象是否被用作消息並相應地執行。

這是在註釋之前在Java中使用了很多東西。在.Net中,使用屬性更清晰。


@ Stimpy77謝謝!我沒有這樣想過。 我希望你能讓我以更一般的方式改變你的評論。

註解和屬性必須在運行時使用反射進行檢查。可以在編譯時使用編譯器中的類型系統檢查空接口。這在運行時不會帶來任何開銷,因此速度更快。

+8

要小心.NET的註釋,它需要使用反射來使用屬性,速度較慢並且不支持「X是Y」和「X爲Y」語義。你也可以在.NET中使用空接口。 – 2009-01-09 02:28:10

0

我會說它用於「未來」參考,或者如果你想共享一些對象,這意味着你可以有10個類實現這個接口。

並讓他們發送到他們的工作功能,但如果接口是空的,我會說它只是「預」工作。

7

在Java中,空接口通常用於「標記」類 - 這些日子通常會使用註釋。

這只是一種向類中添加一些元數據的方式,即使沒有共同成員參與時,該類也適用於「<this>類型的使用」。

+1

這聽起來像是濫用了這個概念或者一個聰明的想法。可能都是;-)。 – 2008-12-19 11:11:18

+1

註釋之前,這是有點合理。現在沒有理由使用它,國際海事組織。 – 2008-12-19 11:14:30

9

在java Serializable是一個完美的例子。它沒有定義任何方法,但每個「實現」它的類必須確保它是真正可序列化的,並且不能引用不能序列化的東西,如數據庫連接,打開的文件等。

+0

而且你更傾向於添加serialVersionUID – Eldelshell 2009-01-09 10:29:16

2

通常是相似的屬性。使用屬性是首選空接口(至少與FxCop知道的一樣)。然而,.NET本身使用一些接口,如IRequiresSessionStateIReadOnlySessionState。我認爲在使用使它們使用接口的屬性時,元數據查找會出現性能損失。

0

它們被稱爲「標記接口」,用於表示標記類的實例。

例如...在C++中是標記爲「ICollectible」對象的常見做法,因此它們可以存儲在通用的非類型集合中。因此,像某人說過的,他們將發出一些對象支持的行爲,例如被收集,序列化等的能力。

0

空接口用於記錄該實現給定的接口的類有一定的行爲

例如在Java Java中的Cloneable接口是一個空的接口。當一個類實現了Cloneable接口時,您知道可以調用它運行clone()

1

已與NServiceBus過去一年工作。雖然我不會說Udi Dahan我的理解是,這個接口的確主要用作標記

雖然我建議你問問他自己,如果他有想過要離開這個未來的擴展。我的賭注是否定的,因爲咒語似乎是保持消息非常簡單或至少實際上是平臺不可知的。

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

2

一個空接口只是作爲數據類型的佔位符,在接口行爲中沒有更好的指定。

在Java中,接口擴展的機制代表了一個很好的使用示例。例如,讓我們說,我們已經下

interface one {} 
interface two {} 

interface three extends one, two {} 

接口三人將繼承「一」和「二」的行爲,所以

class four implements three { ... } 

必須指定的兩種方法,是類型'三'。

正如你所看到的,從上面的例子中,空接口也可以看作是多繼承的一個點(在Java中不允許)。

希望這有助於澄清與進一步的觀點。

0

空接口用於標記類,在運行時可以使用接口執行類型檢查。

例如 來自Java編程語言的標記接口的應用是Serializable接口。一個類實現這個接口來表明它的非瞬態數據成員可以被寫入ObjectOutputStream。 ObjectOutputStream私有方法writeObject()包含一系列instanceof測試來確定可寫性,其中一個查找Serializable接口。如果這些測試中的任何一個失敗,該方法將拋出一個NotSerializableException異常。