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

同名、类型不同 → 严重冲突,必须显式实现

  1. 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 类型,实现一次,两个接口共用

  1. string IA.C {get;set;}

显式实现 IA 的 C 属性,无访问修饰符

  1. int IB.C {get;set;}

显式实现 IB 的 C 属性,无访问修饰符

  1. 两个 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. 都不能被实例化
    1. 都可以包含未实现的成员,由派生类实现

不同点(逐条背诵)

  • 1. 成员结构不同

  • 抽象类:可以有普通成员(有方法体)、字段、抽象成员

  • 接口:全部成员都是抽象、无实现

  • 2. 继承数量不同

  • 抽象类:类只能单继承

  • 接口:类可以多实现

  • 3. 重写方式不同

  • 抽象类:子类必须用 override 重写

  • 接口:直接实现,不需要 override

  • 4. 访问修饰符不同

  • 抽象类:可以使用任意访问修饰符

  • 接口:成员默认public,不能手动写修饰符

  • 5. 成员类型不同

  • 抽象类:可以有 字段、属性、方法

  • 接口:不能有字段,只能有属性、方法

对比维度 抽象类 abstract 接口 interface
成员类型 可以有普通方法、字段、属性、抽象方法 只能有属性、方法,不能有字段、普通实现
继承数量 单继承,一个类只能继承一个抽象类 多实现,一个类可实现无数接口
重写方式 必须用 override 重写 直接实现,不需要 override
访问修饰符 支持所有访问修饰符 默认public,不能手动修改
主体功能 代码复用、模板类 规范、行为约束、多态

八、终极总结口诀

多接口同名同类型,实现一次就够用

多接口同名不同型,显式实现分清楚

显式实现无修饰,只能接口变量读

接口可多可继承,全部成员要实现

抽象有体有字段,接口全抽

相关推荐
波力海苔夹心脆6757 分钟前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩28 分钟前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
文丑颜不良啊42 分钟前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发1 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力1 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力1 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A2 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵2 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
nice_lcj5202 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
AI导出鸭PC端2 小时前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭