3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
標(biāo)記接口用于將類的功能標(biāo)記為在運(yùn)行時(shí)實(shí)現(xiàn)特定接口。
在界面設(shè)計(jì)和.NET類型設(shè)計(jì)準(zhǔn)則-界面設(shè)計(jì)勸阻贊成使用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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
由于每個(gè)其他答案都說“應(yīng)該避免它們”,因此解釋原因會(huì)很有用。
首先,為什么使用標(biāo)記接口:它們的存在是為了允許使用實(shí)現(xiàn)它的對(duì)象的代碼檢查它們是否實(shí)現(xiàn)了所述接口,如果有,則以不同的方式處理對(duì)象。
這種方法的問題在于它破壞了封裝。對(duì)象本身現(xiàn)在可以間接控制外部使用方式。此外,它了解將要使用的系統(tǒng)。通過應(yīng)用標(biāo)記接口,類定義表明它希望用于檢查標(biāo)記存在的某個(gè)地方。它隱含地了解它所使用的環(huán)境,并試圖定義它應(yīng)該如何被使用。這違背了封裝的想法,因?yàn)樗私馔耆谄渥陨矸秶獯嬖诘南到y(tǒng)的一部分的實(shí)現(xiàn)。
在實(shí)際水平上,這降低了可移植性和可重用性。如果在不同的應(yīng)用程序中重用該類,則需要同時(shí)復(fù)制該接口,并且在新環(huán)境中它可能沒有任何意義,使其完全冗余。
因此,“標(biāo)記”是關(guān)于類的元數(shù)據(jù)。這個(gè)元數(shù)據(jù)不是由類本身使用,只對(duì)(某些!)外部客戶端代碼有意義,因此它可以以某種方式處理對(duì)象。因?yàn)樗粚?duì)客戶端代碼有意義,所以元數(shù)據(jù)應(yīng)該在客戶端代碼中,而不是類API。
一個(gè)“標(biāo)記接口”和普通接口之間的區(qū)別是,方法的接口告訴外面的世界怎么可以使用,而空的接口意味著它告訴外面的世界如何應(yīng)該被使用。
- 3 回答
- 0 關(guān)注
- 807 瀏覽
添加回答
舉報(bào)