一、多接口同名成员 核心规则
1. 两种重名情况区分(必考)
情况1:同名、同类型
多个接口存在名称相同、数据类型也相同 的属性/方法 → 只需要实现一次(隐式实现即可)。
案例:IA 和 IB 都有 string B {get;set;}
cs
// 两个接口同名同类型,实现一次即可
public string B { get; set; }
情况2:同名、不同类型(冲突核心)
多个接口 名称相同、返回/数据类型不同 → 必须使用【显式实现】,否则编译器无法区分,直接报错。
案例:
-
IA中:string C {get;set;} -
IB中:int C {get;set;}
2. 显式实现 固定语法 & 硬性规则
cs
// 显式实现格式:接口名.成员名
string IA.C { get; set; }
int IB.C { get; set; }
显式实现三大铁律
-
❌ 不能加任何访问修饰符(默认私有)
-
必须格式:
接口名.成员 -
只能通过 接口变量 访问,不能通过子类对象直接访问
3. 普通成员(方法)同名重载
IA 无参 F1、IB 有参 F1,属于方法重载,直接正常实现即可,无需显式实现。
cs
public void F1(){}
public void F1(int a){}
二、代码调用逻辑解析
cs
// 向上转型为IA接口类型 → 访问 IA的string C
IA t1 = new Test();
t1.C = "11";
// 向上转型为IB接口类型 → 访问 IB的int C
IB i1 = new Test();
i1.C = 10;
核心:显式实现的成员,由【变量的接口类型】决定调用哪一个。
三、接口的继承(接口多继承)
1. 规则
接口可以继承接口(支持多继承);
当类实现子接口时,必须实现【所有父接口+子接口】的全部成员。
2. 案例代码
cs
// 父接口
interface IC
{
string B { get; set; }
}
// 子接口继承父接口
interface IQ : IC
{
int C { get; set; }
}
// 实现子接口,必须实现父子所有成员
class Test1 : IQ
{
public int C { get; set; } // 子接口IQ成员
public string B { get; set; } // 父接口IC成员
}
总结口诀
实现子接口,必扛全家成员(父、子接口全部实现)
四、接口 VS 抽象类(最全对错对比)
相同点
-
- 都 不能被实例化
-
- 都可以包含 未实现的抽象成员,由派生类实现
不同点(考试必背)
| 对比维度 | 抽象类 abstract | 接口 interface |
|---|---|---|
| 成员类型 | 可包含普通方法、抽象方法、字段、属性 | 无字段,只有属性、方法、事件、索引器 |
| 实现/继承数量 | 类 只能单继承 | 类 可以多实现 |
| 重写方式 | 必须使用 override 重写 | 直接实现,不需要 override |
| 访问修饰符 | 支持所有访问修饰符(public/private等) | 全部默认public,不能手动写修饰符 |
| 主体功能 | 代码复用 + 定义规范 | 纯规范、纯标准、解耦 |
五、终极满分总结(多接口核心)
-
同名同类型,实现一次就够用
-
同名不同类型,必须显式来实现
-
显式实现无修饰,仅靠接口变量访问
-
接口可多继承,子类实现包揽全家