1. 多接口冲突场景

当一个类同时实现多个接口,出现:同名但返回类型不同的属性/方法 → 必须使用 接口显式实现。
2. 显式实现规则
接口名.成员名3. 隐式实现
同名、同类型成员,只需要实现一次,所有接口共用。
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 属性:
string Cint C同名、类型不同 → 严重冲突,必须显式实现
3. F1 方法:方法签名不同(无参/有参),属于重载,不冲突
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 方法参数不同,构成方法重载,分别对应两个接口
多个接口:名字相同、类型不同 = 必须显式实现
多个接口:名字相同、类型相同 = 实现一次共用
IA t1 = new Test(); t1.C = "11"; // 调用 IA的 string C IB i1 = new Test(); i1.C = 10; // 调用 IB的 int 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 属性
1. 成员结构不同
2. 继承数量不同
3. 重写方式不同
抽象类:子类必须用 override 重写
接口:直接实现,不需要 override
4. 访问修饰符不同
抽象类:可以使用任意访问修饰符
接口:成员默认public,不能手动写修饰符
5. 成员类型不同
抽象类:可以有 字段、属性、方法
接口:不能有字段,只能有属性、方法
对比维度 | 抽象类 abstract | 接口 interface |
|---|---|---|
成员类型 | 可以有普通方法、字段、属性、抽象方法 | 只能有属性、方法,不能有字段、普通实现 |
继承数量 | 单继承,一个类只能继承一个抽象类 | 多实现,一个类可实现无数接口 |
重写方式 | 必须用 override 重写 | 直接实现,不需要 override |
访问修饰符 | 支持所有访问修饰符 | 默认public,不能手动修改 |
主体功能 | 代码复用、模板类 | 规范、行为约束、多态 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
您可能感兴趣的文章: