继承 #
一、继承概述 #
继承是面向对象编程的核心特性,允许子类复用和扩展父类的功能。
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