3 回答

TA貢獻1798條經(jīng)驗 獲得超7個贊
標(biāo)記接口用于將類的功能標(biāo)記為在運行時實現(xiàn)特定接口。
在界面設(shè)計和.NET類型設(shè)計準(zhǔn)則-界面設(shè)計勸阻贊成使用C#屬性的使用的標(biāo)記接口,但作為@Jay Bazuzi指出,更容易檢查比屬性標(biāo)記的接口:o is I
所以不是這樣的:
public interface IFooAssignable {} public class FooAssignableAttribute : IFooAssignable { ...}
.NET指南建議您這樣做:
public class FooAssignableAttribute : Attribute { ...}[FooAssignable]public class Foo { ...}

TA貢獻1802條經(jīng)驗 獲得超5個贊
由于每個其他答案都說“應(yīng)該避免它們”,因此解釋原因會很有用。
首先,為什么使用標(biāo)記接口:它們的存在是為了允許使用實現(xiàn)它的對象的代碼檢查它們是否實現(xiàn)了所述接口,如果有,則以不同的方式處理對象。
這種方法的問題在于它破壞了封裝。對象本身現(xiàn)在可以間接控制外部使用方式。此外,它了解將要使用的系統(tǒng)。通過應(yīng)用標(biāo)記接口,類定義表明它希望用于檢查標(biāo)記存在的某個地方。它隱含地了解它所使用的環(huán)境,并試圖定義它應(yīng)該如何被使用。這違背了封裝的想法,因為它了解完全在其自身范圍之外存在的系統(tǒng)的一部分的實現(xiàn)。
在實際水平上,這降低了可移植性和可重用性。如果在不同的應(yīng)用程序中重用該類,則需要同時復(fù)制該接口,并且在新環(huán)境中它可能沒有任何意義,使其完全冗余。
因此,“標(biāo)記”是關(guān)于類的元數(shù)據(jù)。這個元數(shù)據(jù)不是由類本身使用,只對(某些?。┩獠靠蛻舳舜a有意義,因此它可以以某種方式處理對象。因為它只對客戶端代碼有意義,所以元數(shù)據(jù)應(yīng)該在客戶端代碼中,而不是類API。
一個“標(biāo)記接口”和普通接口之間的區(qū)別是,方法的接口告訴外面的世界怎么可以使用,而空的接口意味著它告訴外面的世界如何應(yīng)該被使用。
- 3 回答
- 0 關(guān)注
- 796 瀏覽
添加回答
舉報