继承 #

一、继承概述 #

继承是面向对象编程的核心特性,允许子类复用和扩展父类的功能。

1.1 继承特点 #

  • 单继承:一个类只能有一个直接父类
  • 传递性:子类继承父类的所有成员
  • 所有类都继承自Object

1.2 基本语法 #

csharp
public class Animal
{
    public string Name { get; set; }
    
    public void Eat()
    {
        Console.WriteLine($"{Name}正在吃东西");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{Name}正在叫");
    }
}

var dog = new Dog { Name = "旺财" };
dog.Eat();
dog.Bark();

二、访问父类成员 #

2.1 访问继承的成员 #

csharp
public class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Dog : Animal
{
    public void Introduce()
    {
        Console.WriteLine($"我是{Name},今年{Age}岁");
    }
}

2.2 base关键字 #

csharp
public class Animal
{
    public string Name { get; }
    
    public Animal(string name)
    {
        Name = name;
    }
    
    public virtual void MakeSound()
    {
        Console.WriteLine("动物发出声音");
    }
}

public class Dog : Animal
{
    public string Breed { get; }
    
    public Dog(string name, string breed) : base(name)
    {
        Breed = breed;
    }
    
    public override void MakeSound()
    {
        base.MakeSound();
        Console.WriteLine("汪汪汪");
    }
}

三、方法重写 #

3.1 virtual和override #

csharp
public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("动物发出声音");
    }
}

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

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

Animal animal = new Dog();
animal.MakeSound();

3.2 重写属性 #

csharp
public class Shape
{
    public virtual double Area => 0;
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
    
    public override double Area => Width * Height;
}

public class Circle : Shape
{
    public double Radius { get; set; }
    
    public override double Area => Math.PI * Radius * Radius;
}

3.3 sealed关键字 #

csharp
public class Animal
{
    public virtual void MakeSound() { }
}

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

public class Husky : Dog
{
}

3.4 new关键字 #

csharp
public class Animal
{
    public void MakeSound()
    {
        Console.WriteLine("动物发出声音");
    }
}

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

Animal animal = new Dog();
animal.MakeSound();

Dog dog = new Dog();
dog.MakeSound();

四、构造方法与继承 #

4.1 调用基类构造方法 #

csharp
public class Animal
{
    public string Name { get; }
    
    public Animal(string name)
    {
        Name = name;
    }
}

public class Dog : Animal
{
    public string Breed { get; }
    
    public Dog(string name, string breed) : base(name)
    {
        Breed = breed;
    }
}

4.2 构造方法链 #

csharp
public class Animal
{
    public string Name { get; }
    public int Age { get; }
    
    public Animal(string name) : this(name, 0) { }
    
    public Animal(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

public class Dog : Animal
{
    public string Breed { get; }
    
    public Dog(string name) : base(name) { }
    
    public Dog(string name, int age, string breed) : base(name, age)
    {
        Breed = breed;
    }
}

五、抽象类与继承 #

5.1 抽象类 #

csharp
public abstract class Shape
{
    public abstract double Area { get; }
    public abstract double Perimeter { get; }
    
    public void Display()
    {
        Console.WriteLine($"面积:{Area},周长:{Perimeter}");
    }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
    
    public override double Area => Width * Height;
    public override double Perimeter => 2 * (Width + Height);
}

5.2 抽象方法 #

csharp
public abstract class Database
{
    public abstract void Connect();
    public abstract void Disconnect();
    public abstract void ExecuteQuery(string sql);
    
    public void Log(string message)
    {
        Console.WriteLine($"[{DateTime.Now}] {message}");
    }
}

public class SqlServer : Database
{
    public override void Connect()
    {
        Log("连接SQL Server");
    }
    
    public override void Disconnect()
    {
        Log("断开SQL Server连接");
    }
    
    public override void ExecuteQuery(string sql)
    {
        Log($"执行SQL:{sql}");
    }
}

六、密封类 #

6.1 密封类 #

csharp
public sealed class Singleton
{
    private static Singleton _instance;
    
    private Singleton() { }
    
    public static Singleton Instance => _instance ??= new Singleton();
}

6.2 密封方法 #

csharp
public class Base
{
    public virtual void Method1() { }
    public virtual void Method2() { }
}

public class Derived : Base
{
    public sealed override void Method1()
    {
    }
    
    public override void Method2()
    {
    }
}

七、类型转换 #

7.1 向上转型 #

csharp
Dog dog = new Dog("旺财", "金毛");
Animal animal = dog;

7.2 向下转型 #

csharp
Animal animal = new Dog("旺财", "金毛");

if (animal is Dog dog)
{
    dog.Bark();
}

Dog dog = (Dog)animal;
Dog dog = animal as Dog;

7.3 is和as #

csharp
Animal animal = new Dog("旺财", "金毛");

if (animal is Dog)
{
    Console.WriteLine("是狗");
}

Dog dog = animal as Dog;
if (dog != null)
{
    dog.Bark();
}

if (animal is Dog d)
{
    d.Bark();
}

八、实战示例 #

8.1 员工管理系统 #

csharp
public abstract class Employee
{
    public int Id { get; }
    public string Name { get; }
    public decimal BaseSalary { get; }
    
    protected Employee(int id, string name, decimal baseSalary)
    {
        Id = id;
        Name = name;
        BaseSalary = baseSalary;
    }
    
    public abstract decimal CalculateSalary();
    
    public virtual void Display()
    {
        Console.WriteLine($"ID: {Id}, 姓名: {Name}, 工资: {CalculateSalary():C}");
    }
}

public class FullTimeEmployee : Employee
{
    public decimal Bonus { get; set; }
    
    public FullTimeEmployee(int id, string name, decimal baseSalary, decimal bonus = 0)
        : base(id, name, baseSalary)
    {
        Bonus = bonus;
    }
    
    public override decimal CalculateSalary() => BaseSalary + Bonus;
}

public class PartTimeEmployee : Employee
{
    public int HoursWorked { get; set; }
    public decimal HourlyRate { get; }
    
    public PartTimeEmployee(int id, string name, decimal hourlyRate)
        : base(id, name, 0)
    {
        HourlyRate = hourlyRate;
    }
    
    public override decimal CalculateSalary() => HoursWorked * HourlyRate;
    
    public override void Display()
    {
        Console.WriteLine($"ID: {Id}, 姓名: {Name}, 工时: {HoursWorked}, 工资: {CalculateSalary():C}");
    }
}

8.2 图形系统 #

csharp
public abstract class Shape
{
    public string Name => GetType().Name;
    public abstract double Area { get; }
    public abstract double Perimeter { get; }
    
    public virtual void Draw()
    {
        Console.WriteLine($"绘制{Name}");
    }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
    
    public Rectangle(double width, double height)
    {
        Width = width;
        Height = height;
    }
    
    public override double Area => Width * Height;
    public override double Perimeter => 2 * (Width + Height);
    
    public override void Draw()
    {
        Console.WriteLine($"绘制{Width}x{Height}的矩形");
    }
}

public class Circle : Shape
{
    public double Radius { get; set; }
    
    public Circle(double radius)
    {
        Radius = radius;
    }
    
    public override double Area => Math.PI * Radius * Radius;
    public override double Perimeter => 2 * Math.PI * Radius;
    
    public override void Draw()
    {
        Console.WriteLine($"绘制半径为{Radius}的圆形");
    }
}

九、总结 #

继承要点:

要点 说明
单继承 一个类只能有一个父类
virtual/override 虚方法与重写
base 访问父类成员
sealed 密封类/方法
abstract 抽象类/方法

下一步,让我们学习多态!

最后更新:2026-03-26