2 回答

TA貢獻1946條經驗 獲得超3個贊
您應該從 MSDN 上閱讀有關Interface Design
https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/interface
? 如果您需要一些通用 API 由一組類型(包括值類型)支持,請務必定義一個接口。
? 如果您需要在已經從其他類型繼承的類型上支持其功能,請考慮定義一個接口。
X 避免使用標記接口(沒有成員的接口)。
如果需要將類標記為具有特定特征(標記),通常使用自定義屬性而不是接口。
? 務必提供至少一種類型,它是接口的實現。
這樣做有助于驗證接口的設計。例如,List 是 IList 接口的實現。
? 務必提供至少一個使用您定義的每個接口的 API(一種將接口作為參數的方法或類型化為接口的屬性)。
這樣做有助于驗證界面設計。例如,List.Sort 使用 System.Collections.Generic.IComparer 接口。
X 不要將成員添加到以前發布的接口中。
更多參考:空接口空接口代碼有味道嗎?
標記界面 標記界面 的用途是什么?

TA貢獻1921條經驗 獲得超9個贊
這稱為“標記界面”。有時它們被用來表示一個類是用于特定目的的。這不是一種理想的做法。
雖然我使用了標記界面,但這里是它們造成的問題的說明。假設我有一個List<ICube>. 也許我將它作為方法參數接收。
public interface ICube {} // It's empty!
public void DoSomethingWithTheseCubes(List<ICube> cubes)
{
foreach(var cube in cubes)
{
// what do I do with this cube?
}
}
你可以看到我卡在哪里。ICube只是一個標記接口,所以它沒有自己的方法或屬性。我對它無能為力。這可能會導致我將每個立方體轉換為其他類型,這樣我就可以用它做一些事情。
public void DoSomethingWithTheseCubes(List<ICube> cubes)
{
foreach(var cube in cubes)
{
(SomeOtherType)cube.DoSomething();
}
}
但是如果我轉換它,我會引發運行時錯誤,因為我可能不確定每個對象的實際運行時類型是什么。如果我知道運行時類型是什么,那么我應該這樣做:
public void DoSomethingWithTheseCubes(List<SomeOtherType> things)
{
foreach(var thing in things)
{
thing.DoSomething();
}
}
我們不能絕對肯定會遇到這個問題,但使用標記界面會引起它。它正在將接口用于其預期目的之外的其他用途。它更像是一個屬性甚至是評論。
接口有兩種協同工作的用途:首先,它描述類實現的成員。其次,它允許我們將實現接口的類轉換為該接口。標記接口兩者都不做。它們允許我們將對象轉換為沒有成員的類型。這充其量是無用的,而在最壞的情況下它是有害的,因為它會導致更多有問題的演員表。
- 2 回答
- 0 關注
- 105 瀏覽
添加回答
舉報