C#中抽象类与接口的差异是否仅为多接口实现与单抽象类继承?
C#抽象类与接口的差异:不止单继承vs多实现
这个观点不正确,除了派生类的继承/实现数量限制外,两者还有不少关键差异:
- 成员访问修饰符规则不同:接口里的所有成员默认都是
public,且不能添加其他修饰符(比如private、protected);抽象类的成员可以灵活设置访问级别,比如抽象方法可以用protected限制仅子类可见,普通方法也可以是private。 - 状态存储能力差异:抽象类可以定义字段、构造函数,能维护对象的状态;接口不能包含字段,也没有构造函数,本质是行为契约,没法存储实例状态。
- 语义与设计目的不同:抽象类体现「is-a」的继承关系(比如
Animal抽象类,Dog继承它,表示狗是一种动物);接口体现「can-do」的契约关系(比如IFlyable接口,Bird和Airplane都可以实现它,表示具备飞行能力)。 - 成员类型限制不同:
- 接口不能包含实例构造函数、静态构造函数,也无法定义实例状态字段(C# 8+允许接口有静态成员,但仍不支持实例状态存储);
- 抽象类可以有静态成员、实例构造函数,甚至能包含完全实现的非抽象方法。
- 值类型适配差异:值类型(如
struct)可以实现任意数量的接口,但永远不能继承抽象类(因为值类型是密封的,仅隐式继承object)。 - 继承体系限制:抽象类可以继承自另一个普通类或抽象类;接口只能继承自其他接口,无法继承类。
内容的提问来源于stack exchange,提问作者sjanisz
相关产品推荐
相关产品推荐

