C# 继承(Inheritance)详解

继承(Inheritance)是 C# 面向对象编程(OOP)的核心特性之一,它允许一个类获得另一个类的成员(字段、属性、方法等),从而实现代码复用,并建立类之间的层次关系。

简单理解:

子类(派生类)继承父类(基类)的特征,并可以扩展或修改这些特征。

例如:

  • 动物 → 狗
  • 交通工具 → 汽车
  • 员工 → 程序员

这些关系都符合:

狗是一种动物

汽车是一种交通工具

程序员是一种员工

在 C# 中通常称为 is-a 关系


1. 基本语法

C# 使用冒号 : 表示继承。

语法:

cs 复制代码
class 子类 : 父类
{

}

例如:

cs 复制代码
// 父类
class Animal
{
    public string Name;

    public void Eat()
    {
        Console.WriteLine("动物吃东西");
    }
}


// 子类继承 Animal
class Dog : Animal
{

}

使用:

复制代码
Dog dog = new Dog();

dog.Name = "旺财";

dog.Eat();

输出:

复制代码
动物吃东西

虽然 Dog 没有定义 Eat() 方法,但是继承了 Animal 的方法。


2. 继承获得什么?

子类可以继承父类:

成员 是否继承
public 字段
public 属性
public 方法
protected 成员
private 成员
构造函数
析构函数

例如:

cs 复制代码
class Person
{
    public string Name;

    protected int Age;

    private string Password;

    public void Speak()
    {
        Console.WriteLine("说话");
    }
}


class Student : Person
{

}

Student:

可以访问:

cs 复制代码
Name;
Age;
Speak();

不能访问:

复制代码
Password;

3. 父类和子类关系

例如:

cs 复制代码
class Animal
{
    public void Eat()
    {
        Console.WriteLine("吃东西");
    }
}


class Cat : Animal
{
    public void CatchMouse()
    {
        Console.WriteLine("抓老鼠");
    }
}

调用:

cs 复制代码
Cat cat = new Cat();

cat.Eat();
cat.CatchMouse();

输出:

复制代码
吃东西
抓老鼠

结构:

复制代码
Animal
  |
  |
 Cat

Cat 拥有:

复制代码
Eat()
CatchMouse()

4. 子类扩展父类功能

继承最大的作用:

在已有功能基础上增加新功能。

例如:

cs 复制代码
class Employee
{
    public string Name;

    public void Work()
    {
        Console.WriteLine("工作");
    }
}


class Programmer : Employee
{
    public void WriteCode()
    {
        Console.WriteLine("写代码");
    }
}

使用:

cs 复制代码
Programmer p = new Programmer();

p.Name = "张三";

p.Work();

p.WriteCode();

输出:

复制代码
工作
写代码

5. 方法重写(override)

继承后,有时候子类需要改变父类的方法行为。

这叫:

方法重写(Override)

父类:

cs 复制代码
class Animal
{
    public virtual void Sound()
    {
        Console.WriteLine("动物叫");
    }
}

注意:

virtual

表示:

这个方法允许子类修改。

子类:

cs 复制代码
class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("汪汪叫");
    }
}

调用:

cs 复制代码
Animal a = new Dog();

a.Sound();

输出:

复制代码
汪汪叫

6. virtual 和 override

继承中常见组合:

父类

复制代码
public virtual 方法()

允许修改。

子类

复制代码
public override 方法()

重新实现。

例如:

cs 复制代码
class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("画图形");
    }
}


class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("画圆");
    }
}

7. base 关键字

base 表示:

调用父类成员

例如:

cs 复制代码
class Animal
{
    public void Eat()
    {
        Console.WriteLine("吃东西");
    }
}


class Dog : Animal
{
    public void Eat()
    {
        base.Eat();

        Console.WriteLine("狗吃骨头");
    }
}

调用:

cs 复制代码
Dog d = new Dog();

d.Eat();

输出:

复制代码
吃东西
狗吃骨头

8. 调用父类构造函数

子类对象创建时:

一定会先调用父类构造函数。

例如:

cs 复制代码
class Person
{
    public Person()
    {
        Console.WriteLine("Person构造");
    }
}


class Student : Person
{
    public Student()
    {
        Console.WriteLine("Student构造");
    }
}

执行:

复制代码
Student s = new Student();

输出:

复制代码
Person构造
Student构造

顺序:

复制代码
父类构造
    ↓
子类构造

9. 使用 base 调父类构造

父类:

cs 复制代码
class Person
{
    public Person(string name)
    {
        Console.WriteLine(name);
    }
}

子类:

cs 复制代码
class Student : Person
{
    public Student()
        : base("学生")
    {

    }
}

执行:

复制代码
Student s = new Student();

输出:

复制代码
学生

10. C# 不支持多继承

C#:

❌ 不允许:

cs 复制代码
class Dog : Animal, Pet
{

}

一个类只能继承一个父类。

但是支持多个接口:

cs 复制代码
class Dog : Animal, IRunnable, IFlyable
{

}

结构:

cs 复制代码
        Animal
           |
          Dog
        /     \
 IRunnable   IFlyable

11. sealed 禁止继承

如果不希望别人继承你的类:

使用:

复制代码
sealed

例如:

cs 复制代码
sealed class MathHelper
{

}

下面会报错:

cs 复制代码
class MyMath : MathHelper
{

}

错误:

复制代码
无法从密封类型继承

12. 抽象类继承

抽象类:

不能直接创建对象。

例如:

cs 复制代码
abstract class Animal
{
    public abstract void Sound();
}

子类必须实现:

cs 复制代码
class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("汪汪");
    }
}

使用:

复制代码
Animal a = new Dog();

a.Sound();

13. 继承与多态

继承是多态的基础。

例如:

cs 复制代码
class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("动物声音");
    }
}


class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("汪汪");
    }
}


class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("喵喵");
    }
}

统一调用:

cs 复制代码
Animal[] animals =
{
    new Dog(),
    new Cat()
};


foreach(Animal a in animals)
{
    a.Speak();
}

输出:

复制代码
汪汪
喵喵

这就是:

父类引用指向不同子类对象。


14. 类型转换

向上转换(自动)

子类 → 父类

安全:

cs 复制代码
Dog dog = new Dog();

Animal animal = dog;

向下转换(需要强制)

父类 → 子类

cs 复制代码
Animal animal = new Dog();

Dog dog = (Dog)animal;

15. is 判断类型

cs 复制代码
if(animal is Dog)
{
    Console.WriteLine("这是狗");
}

16. as 转换

cs 复制代码
Dog dog = animal as Dog;

if(dog != null)
{
    dog.Sound();
}

17. 继承实际案例

例如游戏开发:

父类:

cs 复制代码
class Character
{
    public int HP;

    public virtual void Attack()
    {
        Console.WriteLine("攻击");
    }
}

战士:

cs 复制代码
class Warrior : Character
{
    public override void Attack()
    {
        Console.WriteLine("挥剑攻击");
    }
}

法师:

cs 复制代码
class Mage : Character
{
    public override void Attack()
    {
        Console.WriteLine("释放魔法");
    }
}

调用:

cs 复制代码
Character c1 = new Warrior();

Character c2 = new Mage();

c1.Attack();

c2.Attack();

输出:

复制代码
挥剑攻击
释放魔法

18. 继承设计原则

适合继承:

例如:

复制代码
动物
 |
 狗

因为:

复制代码
狗 是 动物

不适合继承:

例如:

cs 复制代码
汽车
 |
 发动机

因为:

复制代码
发动机不是汽车

这种应该使用组合:

复制代码
class Car
{
    Engine engine;
}

19. 继承 vs 组合

特点 继承 组合
关系 is-a has-a
代码复用
耦合
灵活性
推荐程度 谨慎使用 优先考虑

现代 C# 开发中:

优先组合,谨慎继承。


20. C# 继承核心总结

关键字 作用
: 表示继承
virtual 允许重写
override 重写父类方法
base 访问父类
abstract 抽象类/抽象方法
sealed 禁止继承
protected 给子类访问
is 类型判断
as 安全转换

一句话总结

C# 继承让子类复用父类代码,并通过 virtual + override 实现多态,是面向对象设计中实现扩展和复用的重要机制。

继承通常和 封装、抽象、多态 一起构成 C# 面向对象编程的四大核心思想。

相关推荐
摩西蒙5 小时前
计算机网络
开发语言·计算机网络·php
YuePeng5 小时前
别再让 AI 直接写 SQL 了:一个注解搞定十亿行数据的语义层
后端·github
半夜里咳嗽的狼5 小时前
Go 1.25 的 WaitGroup.Go 省了两行代码,也补不上这三个并发边界
后端·go
山峰哥5 小时前
数据库性能救星:Explain执行计划深度拆解
服务器·开发语言·数据库·sql·启发式算法
Lihua奏5 小时前
身份验证:登录之后,服务器怎么一直认得你?
后端
XuCoder5 小时前
Redis 缓存和 MySQL 数据不一致怎么办?双写一致性一次讲透
后端
程序员天天困6 小时前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端
Escape6 小时前
为什么你的 AI 越聊越傻?从 Token 到 Agent,彻底搞懂 AI Agent的秘密㊙️
前端·人工智能·后端
用户40966601317517 小时前
Lombok 你用对了吗?@Data 之外的 6 个隐藏神器
java·后端·代码规范
董员外7 小时前
RAG 系统进化论(二):Naive RAG,检索增强生成的最小闭环
前端·人工智能·后端