C#多接口實現(xiàn)、重名成員、顯式實現(xiàn)、接口繼承+抽象類和接口區(qū)別說明
一、核心知識點前置(必考)
1. 多接口沖突場景
當一個類同時實現(xiàn)多個接口,出現(xiàn):同名但返回類型不同的屬性/方法 → 必須使用 接口顯式實現(xiàn)。
2. 顯式實現(xiàn)規(guī)則
- 格式:
接口名.成員名 - 不能加 public 修飾符(默認私有)
- 只能通過 對應接口變量 訪問,不能通過類對象訪問
3. 隱式實現(xiàn)
同名、同類型成員,只需要實現(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 → 同名同類型 → 無需沖突,隱式實現(xiàn)一次即可
2.C 屬性:
- IA:
string C - IB:
int C
同名、類型不同 → 嚴重沖突,必須顯式實現(xiàn)
3. F1 方法:方法簽名不同(無參/有參),屬于重載,不沖突
三、Test 類實現(xiàn)多接口(核心考點)
class Test:IA, IB
{
// 隱式實現(xiàn):共用同名同類型成員
public int A { get; set; }
public string B { get; set; }
// 顯式實現(xiàn) IA 的 C(string類型)
string IA.C { get; set; }
// 顯式實現(xiàn) IB 的 C(int類型)
int IB.C { get; set; }
// 無參F1 實現(xiàn) IA
public void F1()
{
}
// 有參F1 實現(xiàn) IB
public void F1(int a)
{
}
}
逐行解析
1. public string B
兩個接口 B 都是 string 類型,實現(xiàn)一次,兩個接口共用
2. string IA.C {get;set;}
顯式實現(xiàn) IA 的 C 屬性,無訪問修飾符
3. int IB.C {get;set;}
顯式實現(xiàn) IB 的 C 屬性,無訪問修飾符
4. 兩個 F1 方法參數(shù)不同,構成方法重載,分別對應兩個接口
顯式實現(xiàn)核心規(guī)則(背誦)
多個接口:名字相同、類型不同 = 必須顯式實現(xiàn)
多個接口:名字相同、類型相同 = 實現(xiàn)一次共用
四、Main 方法調用解析
IA t1 = new Test(); t1.C = "11"; // 調用 IA的 string C IB i1 = new Test(); i1.C = 10; // 調用 IB的 int C
原理
顯式實現(xiàn)的成員 只能通過對應接口變量訪問
- 1. 接口 IA 變量 → 只能找到 IA.C(string)
- 2. 接口 IB 變量 → 只能找到 IB.C(int)
- 3. 不能用 Test 類對象直接點 C,會報錯
五、接口的繼承(接口拓展)
interface IC
{
string B { get; set; }
}
interface IQ : IC
{
int C { get; set; }
}
知識點
接口可以繼承接口
IQ 繼承 IC,意味著:
IQ 接口包含自己的所有成員 + 父接口 IC 的所有成員
六、類實現(xiàn)繼承接口(必須實現(xiàn)全部層級成員)
class Test1 : IQ
{
public int C { get ; set ; }
public string B { get; set; }
}規(guī)則(必考原話)
如果一個類實現(xiàn)了子接口,子接口繼承了父接口,當前類必須實現(xiàn)【所有父接口+子接口】的全部成員
Test1 實現(xiàn) IQ,IQ 繼承 IC
所以必須實現(xiàn):
IC 的 B 屬性 + IQ 的 C 屬性
七、接口 VS 抽象類(滿分簡答題標準答案)
相同點
- 1. 都不能被實例化
- 2. 都可以包含未實現(xiàn)的成員,由派生類實現(xiàn)
不同點(逐條背誦)
1. 成員結構不同
- 抽象類:可以有普通成員(有方法體)、字段、抽象成員
- 接口:全部成員都是抽象、無實現(xiàn)
2. 繼承數(shù)量不同
- 抽象類:類只能單繼承
- 接口:類可以多實現(xiàn)
3. 重寫方式不同
抽象類:子類必須用 override 重寫
接口:直接實現(xiàn),不需要 override
4. 訪問修飾符不同
抽象類:可以使用任意訪問修飾符
接口:成員默認public,不能手動寫修飾符
5. 成員類型不同
抽象類:可以有 字段、屬性、方法
接口:不能有字段,只能有屬性、方法
對比維度 | 抽象類 abstract | 接口 interface |
|---|---|---|
成員類型 | 可以有普通方法、字段、屬性、抽象方法 | 只能有屬性、方法,不能有字段、普通實現(xiàn) |
繼承數(shù)量 | 單繼承,一個類只能繼承一個抽象類 | 多實現(xiàn),一個類可實現(xiàn)無數(shù)接口 |
重寫方式 | 必須用 override 重寫 | 直接實現(xiàn),不需要 override |
訪問修飾符 | 支持所有訪問修飾符 | 默認public,不能手動修改 |
主體功能 | 代碼復用、模板類 | 規(guī)范、行為約束、多態(tài) |
八、終極總結口訣
- 多接口同名同類型,實現(xiàn)一次就夠用
- 多接口同名不同型,顯式實現(xiàn)分清楚
- 顯式實現(xiàn)無修飾,只能接口變量讀
- 接口可多可繼承,全部成員要實現(xiàn)
- 抽象有體有字段,接口全抽
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
.NET利用C#字節(jié)流動態(tài)操作Excel文件
在.NET開發(fā)中,通過字節(jié)流動態(tài)操作Excel文件提供了一種高效且靈活的方式處理數(shù)據,本文將演示如何在.NET平臺使用C#通過字節(jié)流創(chuàng)建,讀取,編輯及保存Excel文件,需要的可以參考下2024-12-12

