C#多接口實(shí)現(xiàn)、重名成員、顯式實(shí)現(xiàn)、接口繼承+抽象類和接口區(qū)別說明
一、核心知識(shí)點(diǎn)前置(必考)
1. 多接口沖突場(chǎng)景
當(dāng)一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口,出現(xiàn):同名但返回類型不同的屬性/方法 → 必須使用 接口顯式實(shí)現(xiàn)。
2. 顯式實(shí)現(xiàn)規(guī)則
- 格式:
接口名.成員名 - 不能加 public 修飾符(默認(rèn)私有)
- 只能通過 對(duì)應(yīng)接口變量 訪問,不能通過類對(duì)象訪問
3. 隱式實(shí)現(xiàn)
同名、同類型成員,只需要實(shí)現(xiàn)一次,所有接口共用。
二、沖突接口定義 IA、IB
interface IA
{
int A { get; set; }
string B { get; set; }
string C { get; set; }
void F1();
}
interface IB
{
string B { get; set; }
int C { get; set; }
void F1(int a);
}
沖突分析
1. B 屬性:IA、IB 都是 string B → 同名同類型 → 無需沖突,隱式實(shí)現(xiàn)一次即可
2.C 屬性:
- IA:
string C - IB:
int C
同名、類型不同 → 嚴(yán)重沖突,必須顯式實(shí)現(xiàn)
3. F1 方法:方法簽名不同(無參/有參),屬于重載,不沖突
三、Test 類實(shí)現(xiàn)多接口(核心考點(diǎn))
class Test:IA, IB
{
// 隱式實(shí)現(xiàn):共用同名同類型成員
public int A { get; set; }
public string B { get; set; }
// 顯式實(shí)現(xiàn) IA 的 C(string類型)
string IA.C { get; set; }
// 顯式實(shí)現(xiàn) IB 的 C(int類型)
int IB.C { get; set; }
// 無參F1 實(shí)現(xiàn) IA
public void F1()
{
}
// 有參F1 實(shí)現(xiàn) IB
public void F1(int a)
{
}
}
逐行解析
1. public string B
兩個(gè)接口 B 都是 string 類型,實(shí)現(xiàn)一次,兩個(gè)接口共用
2. string IA.C {get;set;}
顯式實(shí)現(xiàn) IA 的 C 屬性,無訪問修飾符
3. int IB.C {get;set;}
顯式實(shí)現(xiàn) IB 的 C 屬性,無訪問修飾符
4. 兩個(gè) F1 方法參數(shù)不同,構(gòu)成方法重載,分別對(duì)應(yīng)兩個(gè)接口
顯式實(shí)現(xiàn)核心規(guī)則(背誦)
多個(gè)接口:名字相同、類型不同 = 必須顯式實(shí)現(xiàn)
多個(gè)接口:名字相同、類型相同 = 實(shí)現(xiàn)一次共用
四、Main 方法調(diào)用解析
IA t1 = new Test(); t1.C = "11"; // 調(diào)用 IA的 string C IB i1 = new Test(); i1.C = 10; // 調(diào)用 IB的 int C
原理
顯式實(shí)現(xiàn)的成員 只能通過對(duì)應(yīng)接口變量訪問
- 1. 接口 IA 變量 → 只能找到 IA.C(string)
- 2. 接口 IB 變量 → 只能找到 IB.C(int)
- 3. 不能用 Test 類對(duì)象直接點(diǎn) C,會(huì)報(bào)錯(cuò)
五、接口的繼承(接口拓展)
interface IC
{
string B { get; set; }
}
interface IQ : IC
{
int C { get; set; }
}
知識(shí)點(diǎn)
接口可以繼承接口
IQ 繼承 IC,意味著:
IQ 接口包含自己的所有成員 + 父接口 IC 的所有成員
六、類實(shí)現(xiàn)繼承接口(必須實(shí)現(xiàn)全部層級(jí)成員)
class Test1 : IQ
{
public int C { get ; set ; }
public string B { get; set; }
}規(guī)則(必考原話)
如果一個(gè)類實(shí)現(xiàn)了子接口,子接口繼承了父接口,當(dāng)前類必須實(shí)現(xiàn)【所有父接口+子接口】的全部成員
Test1 實(shí)現(xiàn) IQ,IQ 繼承 IC
所以必須實(shí)現(xiàn):
IC 的 B 屬性 + IQ 的 C 屬性
七、接口 VS 抽象類(滿分簡(jiǎn)答題標(biāo)準(zhǔn)答案)
相同點(diǎn)
- 1. 都不能被實(shí)例化
- 2. 都可以包含未實(shí)現(xiàn)的成員,由派生類實(shí)現(xiàn)
不同點(diǎn)(逐條背誦)
1. 成員結(jié)構(gòu)不同
- 抽象類:可以有普通成員(有方法體)、字段、抽象成員
- 接口:全部成員都是抽象、無實(shí)現(xiàn)
2. 繼承數(shù)量不同
- 抽象類:類只能單繼承
- 接口:類可以多實(shí)現(xiàn)
3. 重寫方式不同
抽象類:子類必須用 override 重寫
接口:直接實(shí)現(xiàn),不需要 override
4. 訪問修飾符不同
抽象類:可以使用任意訪問修飾符
接口:成員默認(rèn)public,不能手動(dòng)寫修飾符
5. 成員類型不同
抽象類:可以有 字段、屬性、方法
接口:不能有字段,只能有屬性、方法
對(duì)比維度 | 抽象類 abstract | 接口 interface |
|---|---|---|
成員類型 | 可以有普通方法、字段、屬性、抽象方法 | 只能有屬性、方法,不能有字段、普通實(shí)現(xiàn) |
繼承數(shù)量 | 單繼承,一個(gè)類只能繼承一個(gè)抽象類 | 多實(shí)現(xiàn),一個(gè)類可實(shí)現(xiàn)無數(shù)接口 |
重寫方式 | 必須用 override 重寫 | 直接實(shí)現(xiàn),不需要 override |
訪問修飾符 | 支持所有訪問修飾符 | 默認(rèn)public,不能手動(dòng)修改 |
主體功能 | 代碼復(fù)用、模板類 | 規(guī)范、行為約束、多態(tài) |
八、終極總結(jié)口訣
- 多接口同名同類型,實(shí)現(xiàn)一次就夠用
- 多接口同名不同型,顯式實(shí)現(xiàn)分清楚
- 顯式實(shí)現(xiàn)無修飾,只能接口變量讀
- 接口可多可繼承,全部成員要實(shí)現(xiàn)
- 抽象有體有字段,接口全抽
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#中遍歷DataSet數(shù)據(jù)集對(duì)象實(shí)例
這篇文章主要介紹了C#中遍歷DataSet數(shù)據(jù)集對(duì)象實(shí)例,經(jīng)常忘記如何操作DataSet,這里記下來并分享,讓需要的朋友可以參考下2014-08-08
.NET利用C#字節(jié)流動(dòng)態(tài)操作Excel文件
在.NET開發(fā)中,通過字節(jié)流動(dòng)態(tài)操作Excel文件提供了一種高效且靈活的方式處理數(shù)據(jù),本文將演示如何在.NET平臺(tái)使用C#通過字節(jié)流創(chuàng)建,讀取,編輯及保存Excel文件,需要的可以參考下2024-12-12
C#獲取時(shí)間戳的方法及時(shí)間戳轉(zhuǎn)換問題
本文主要介紹了C#獲取時(shí)間戳的方法及時(shí)間戳轉(zhuǎn)換問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
C#?WPF中RadioButton控件的用法及應(yīng)用場(chǎng)景
在WPF應(yīng)用程序中,RadioButton控件是一種常用的用戶界面元素,本文主要介紹了C#?WPF中RadioButton控件的用法及應(yīng)用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
詳解WPF如何動(dòng)態(tài)生成DataGrid的行和列
在日常開發(fā)中,DataGrid作為二維表格,非常適合數(shù)據(jù)的展示和統(tǒng)計(jì),本文以一些簡(jiǎn)單的小例子,簡(jiǎn)述在WPF開發(fā)中,如何動(dòng)態(tài)生成DataGrid的行和列,需要的可以了解下2024-02-02

