C#多接口实现、重名成员、显式实现、接口继承+抽象类和接口区别说明
一、核心知识点前置(必考)
1. 多接口冲突场景
当一个类同时实现多个接口,出现:同名但返回类型不同的属性/方法 → 必须使用 接口显式实现。
2. 显式实现规则
- 格式:
接口名.成员名 - 不能加 public 修饰符(默认私有)
- 只能通过 对应接口变量 访问,不能通过类对象访问
3. 隐式实现
同名、同类型成员,只需要实现一次,所有接口共用。
二、冲突接口定义 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 → 同名同类型 → 无需冲突,隐式实现一次即可
2.C 属性:
- IA:
string C - IB:
int C
同名、类型不同 → 严重冲突,必须显式实现
3. F1 方法:方法签名不同(无参/有参),属于重载,不冲突
三、Test 类实现多接口(核心考点)
class Test:IA, IB
{
// 隐式实现:共用同名同类型成员
public int A { get; set; }
public string B { get; set; }
// 显式实现 IA 的 C(string类型)
string IA.C { get; set; }
// 显式实现 IB 的 C(int类型)
int IB.C { get; set; }
// 无参F1 实现 IA
public void F1()
{
}
// 有参F1 实现 IB
public void F1(int a)
{
}
}
逐行解析
1. public string B
两个接口 B 都是 string 类型,实现一次,两个接口共用
2. string IA.C {get;set;}
显式实现 IA 的 C 属性,无访问修饰符
3. int IB.C {get;set;}
显式实现 IB 的 C 属性,无访问修饰符
4. 两个 F1 方法参数不同,构成方法重载,分别对应两个接口
显式实现核心规则(背诵)
多个接口:名字相同、类型不同 = 必须显式实现
多个接口:名字相同、类型相同 = 实现一次共用
四、Main 方法调用解析
IA t1 = new Test(); t1.C = "11"; // 调用 IA的 string C IB i1 = new Test(); i1.C = 10; // 调用 IB的 int C
原理
显式实现的成员 只能通过对应接口变量访问
- 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 的所有成员
六、类实现继承接口(必须实现全部层级成员)
class Test1 : IQ
{
public int C { get ; set ; }
public string B { get; set; }
}规则(必考原话)
如果一个类实现了子接口,子接口继承了父接口,当前类必须实现【所有父接口+子接口】的全部成员
Test1 实现 IQ,IQ 继承 IC
所以必须实现:
IC 的 B 属性 + IQ 的 C 属性
七、接口 VS 抽象类(满分简答题标准答案)
相同点
- 1. 都不能被实例化
- 2. 都可以包含未实现的成员,由派生类实现
不同点(逐条背诵)
1. 成员结构不同
- 抽象类:可以有普通成员(有方法体)、字段、抽象成员
- 接口:全部成员都是抽象、无实现
2. 继承数量不同
- 抽象类:类只能单继承
- 接口:类可以多实现
3. 重写方式不同
抽象类:子类必须用 override 重写
接口:直接实现,不需要 override
4. 访问修饰符不同
抽象类:可以使用任意访问修饰符
接口:成员默认public,不能手动写修饰符
5. 成员类型不同
抽象类:可以有 字段、属性、方法
接口:不能有字段,只能有属性、方法
对比维度 | 抽象类 abstract | 接口 interface |
|---|---|---|
成员类型 | 可以有普通方法、字段、属性、抽象方法 | 只能有属性、方法,不能有字段、普通实现 |
继承数量 | 单继承,一个类只能继承一个抽象类 | 多实现,一个类可实现无数接口 |
重写方式 | 必须用 override 重写 | 直接实现,不需要 override |
访问修饰符 | 支持所有访问修饰符 | 默认public,不能手动修改 |
主体功能 | 代码复用、模板类 | 规范、行为约束、多态 |
八、终极总结口诀
- 多接口同名同类型,实现一次就够用
- 多接口同名不同型,显式实现分清楚
- 显式实现无修饰,只能接口变量读
- 接口可多可继承,全部成员要实现
- 抽象有体有字段,接口全抽
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。


最新评论