3 回答

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

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