C#类继承用冒号“:”而非extends,语法为class Derived : Base;仅支持单基类但可实现多接口;需显式调用base()构造函数;virtual/override控制方法重写;字段不参与多态,属性和方法才支持。

继承语法怎么写:用 : 而不是 extends
C# 里类继承用冒号 :,不是 Java 的 extends。写错会直接报错 Syntax error, ':' expected。
基本形式是:class DerivedClass : BaseClass。基类只能有一个(不支持多继承),但可以实现多个接口,用逗号分隔,比如 class C : A, IInterface1, IInterface2。
- 如果基类有构造函数且无默认无参构造,子类必须显式调用
base(...),否则编译失败 -
private成员不会被继承;protected和public才可访问 - 字段不能被重写,只有
virtual/override修饰的方法、属性、索引器才能被子类改写
如何让方法可被重写:必须加 virtual 和 override
和 Java 不同,C# 默认方法不可重写。父类方法要被子类覆盖,得显式标记为 virtual;子类对应方法必须用 override,否则只是隐藏(new),容易引发意料外的多态行为。
例如:
class Animal {
public virtual void Speak() => Console.WriteLine("Some sound");
}
class Dog : Animal {
public override void Speak() => Console.WriteLine("Woof!");
}若漏掉 virtual,子类用 override 会编译错误;若用了 new 而非 override,多态调用时仍执行父类逻辑,这是常见 bug 来源。
构造函数链怎么处理:子类必须主动调用 base()
子类构造函数不会自动调用父类构造函数。如果父类只有带参构造,子类构造器里没写 : base(...),就会报错 There is no argument that matches the call to base constructor。
- 可以写
: base(param1, param2)显式传递参数 - 也可以在子类构造体内部调用
base.Method(),但这不等于构造器调用 - 如果父类有无参构造,子类构造器可省略
base(),系统自动插入
继承中字段和属性的区别:字段不参与多态,属性可以
字段(public string Name;)是静态绑定的,通过父类引用访问时,拿到的是父类字段值,哪怕子类有同名字段——这其实是隐藏,不是重写。
而属性(public virtual string Description { get; set; })配合 override 就能实现运行时多态行为。
所以:需要多态语义的,务必用属性或方法,别依赖字段。
继承不是“复制代码”,而是建立类型契约;真正难的从来不是语法,而是想清楚哪些该开放、哪些该封装、哪些该留作虚方法由子类决定。








