C#抽象类和接口的优缺点分别是什么?

一、抽象类 abstract class 优缺点

优点

  1. 可封装公共字段、属性、构造函数,复用状态
    能定义protected成员、实例变量,子类共用一份属性,减少重复定义字段。
  2. 支持已有实现方法,代码复用强
    普通方法、虚方法可写完整逻辑,子类直接调用,只重写抽象方法即可,减少冗余代码。
  3. 可使用访问修饰符(private/protected/public)
    能控制成员可见性,封装内部逻辑,符合面向对象封装思想。
  4. 构造函数约束子类初始化
    抽象类有构造方法,强制子类实例化时初始化公共数据。
  5. 版本升级友好
    新增普通实例方法,已有子类无需修改、不用强制重写,代码向下兼容。

缺点

  1. 单继承限制:一个类只能继承一个抽象父类
    无法同时继承多个不同基类,扩展受限。
  2. 强耦合继承关系(is-a)
    子类和父类是强继承绑定,后期修改抽象类结构,所有子类大概率受影响。
  3. 不适合给无关类扩展能力
    非继承体系的类不能复用抽象类代码。

二、接口 interface 优缺点(区分C#7.3 / C#8.0+)

优点

  1. 支持多实现:一个类可实现N个接口
    灵活组合多种能力,弥补C#没有多继承的短板,适合能力扩展can-do
  2. 低耦合、面向契约编程
    只定义方法签名,不关心内部实现,依赖注入、单元测试Mock、插件架构首选。
  3. 无关类统一规范
    没有继承关系的类(文件、网络、数据库)可以实现同一个接口(如IDisposable)。
  4. 轻量化,无实例字段
    只做行为约束,不携带状态,设计简洁。
  5. C#8.0+:接口支持默认方法实现
    新增方法可给默认实现,不用修改全部实现类,解决旧版接口升级难题。

缺点

C#7.3及更早版本

  1. 不能定义实例字段、构造函数,无法共享状态数据
    公共属性只能每个实现类各自重复编写。
  2. 所有成员默认public,不能私有化封装
    无法隐藏内部辅助方法。
  3. 新增抽象方法会破坏所有实现类
    接口新加方法后,全部实现类必须补全实现,大规模项目改造成本极高。

C#8.0+

默认实现缓解新增方法报错,但依然不能定义实例字段

三、一句话速记选型

  • 需要共用字段、共用代码、is-a继承 → 抽象类
  • 多能力组合、解耦契约、多类统一标准 → 接口

四、补充对比简表

优点 缺点
抽象类 代码复用高、可存字段、可封装、升级加普通方法无影响 单继承、继承耦合高
接口 多实现、解耦灵活、适配插件DI 无法共用实例字段(老版本新增方法全类报错)
posted @ 2026-06-04 07:21  人生就是修炼  阅读(7)  评论(0)    收藏  举报