C#中带默认方法的接口与抽象类的区别及特性设计疑问
为什么C# 8要在已有抽象类的前提下新增接口默认方法实现特性?
在C# 8发布前,接口与抽象类最核心的区别是抽象类可包含带实现的方法,接口仅能做方法声明。C# 8新增的接口默认方法实现特性,允许给接口方法添加默认逻辑,客户端获取更新后的接口时不会产生兼容性问题,同时也可按需重写对应方法。
这个特性的推出并不是为了替代抽象类,而是为了解决抽象类覆盖不到的场景痛点,核心原因有三个:
- 解决接口演进的兼容性痛点
之前如果要给已经被大量实现类使用的公共接口新增方法,所有实现了该接口的类都必须强制实现新增方法,否则直接编译报错,改动成本极高,甚至会破坏大量已上线的客户端代码。有了默认方法实现之后,新增的接口方法自带默认逻辑,已有实现类不需要做任何改动即可正常运行,完全不会产生兼容性问题,开发者也可以根据业务需求选择是否重写该方法。 - 复用接口独有的特性优势
接口和抽象类的定位本来就有明显差异,接口具备很多抽象类不具备的特性,这些特性的适用场景是抽象类完全覆盖不到的:- 支持多继承:一个类可以实现多个接口,但只能继承一个抽象类,大量需要多继承的场景下抽象类根本无法使用,默认方法实现可以在多继承的场景下复用公共逻辑,不需要每个实现类都编写重复代码。
- 轻量化契约属性:接口没有构造函数、不允许定义非公共成员、不能包含状态字段,比抽象类更适合定义纯行为契约,默认方法实现可以在不破坏接口契约属性的前提下补充公共行为。
- 适配现有接口生态:很多存量项目已经基于接口做了完整的架构设计,不可能全部推翻重构为抽象类实现,默认方法实现可以在不改动现有架构层级的前提下,给已有接口扩展能力。
- 和抽象类的定位完全不冲突
抽象类仍然可以包含状态字段、构造函数、非公共成员、虚方法、复杂的继承层级逻辑,适合定义有从属关系的抽象基类;接口默认方法实现本质上是接口契约的扩展补充,二者的适用场景没有重叠,不存在互相替代的关系。
内容的提问来源于stack exchange,提问作者Vivek Nuna
相关产品推荐
相关产品推荐

