亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是空接口?

什么是空接口?

C#
眼眸繁星 2022-12-24 09:43:11
我正在使用的代碼有一個空界面:public interface ICube {}它沒有方法或屬性。一些類實現ICube而其他接口繼承自ICube.請有人告訴我 ICube 界面有什么好處?
查看完整描述

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 不要將成員添加到以前發布的接口中。

更多參考:空接口空接口代碼有味道嗎?

標記界面 標記界面 的用途是什么?


查看完整回答
反對 回復 2022-12-24
?
郎朗坤

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();

    }

}

我們不能絕對肯定會遇到這個問題,但使用標記界面會引起它。它正在將接口用于其預期目的之外的其他用途。它更像是一個屬性甚至是評論。


接口有兩種協同工作的用途:首先,它描述類實現的成員。其次,它允許我們將實現接口的類轉換為該接口。標記接口兩者都不做。它們允許我們將對象轉換為沒有成員的類型。這充其量是無用的,而在最壞的情況下它是有害的,因為它會導致更多有問題的演員表。


查看完整回答
反對 回復 2022-12-24
  • 2 回答
  • 0 關注
  • 105 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號