跳到主要内容

C# 多态

介绍

多态(Polymorphism)是面向对象编程(OOP)的四大基本特性之一,其他三个分别是封装、继承和抽象。多态允许我们以统一的方式处理不同类型的对象,从而提高代码的灵活性和可扩展性。在 C# 中,多态主要通过继承和方法重写来实现。

简单来说,多态意味着“一个接口,多种实现”。它允许子类重写父类的方法,从而在运行时根据对象的实际类型调用相应的方法。

多态的类型

在 C# 中,多态主要分为两种类型:

  1. 编译时多态(静态多态):通过方法重载实现。
  2. 运行时多态(动态多态):通过方法重写和虚方法实现。

本文将重点介绍运行时多态。


运行时多态:方法重写

运行时多态是通过方法重写(Override)实现的。在 C# 中,我们可以使用 virtual 关键字在父类中定义一个虚方法,然后在子类中使用 override 关键字重写该方法。

示例代码

csharp
using System;

class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("The animal makes a sound");
}
}

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

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

class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // 创建一个 Animal 对象
Animal myDog = new Dog(); // 创建一个 Dog 对象
Animal myCat = new Cat(); // 创建一个 Cat 对象

myAnimal.MakeSound(); // 输出: The animal makes a sound
myDog.MakeSound(); // 输出: The dog barks
myCat.MakeSound(); // 输出: The cat meows
}
}

代码解释

  1. 父类 Animal:定义了一个虚方法 MakeSound,使用 virtual 关键字标记。
  2. 子类 DogCat:分别重写了 MakeSound 方法,使用 override 关键字。
  3. Main 方法:创建了 AnimalDogCat 的对象,并调用它们的 MakeSound 方法。
备注

注意:尽管 myDogmyCat 的类型是 Animal,但在运行时,它们调用的是子类中重写的方法。这就是多态的体现。


多态的实际应用场景

多态在实际开发中有广泛的应用,尤其是在需要处理多种相似但不同的对象时。以下是一个实际案例:

案例:图形绘制

假设我们正在开发一个图形绘制程序,需要支持多种图形(如圆形、矩形、三角形)的绘制。我们可以使用多态来实现统一的绘制接口。

csharp
using System;

class Shape
{
public virtual void Draw()
{
Console.WriteLine("Drawing a shape");
}
}

class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle");
}
}

class Rectangle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a rectangle");
}
}

class Program
{
static void Main(string[] args)
{
Shape[] shapes = new Shape[3];
shapes[0] = new Circle();
shapes[1] = new Rectangle();
shapes[2] = new Shape();

foreach (Shape shape in shapes)
{
shape.Draw();
}
}
}

输出

Drawing a circle
Drawing a rectangle
Drawing a shape

解释

  • 我们定义了一个 Shape 类,并在其中声明了一个虚方法 Draw
  • CircleRectangle 类分别重写了 Draw 方法。
  • Main 方法中,我们创建了一个 Shape 数组,并将不同类型的图形对象存储在其中。
  • 通过遍历数组并调用 Draw 方法,程序会根据对象的实际类型调用相应的重写方法。
提示

多态使得我们可以轻松扩展程序。例如,如果需要添加一个新的图形(如三角形),只需创建一个新的子类并重写 Draw 方法,而无需修改现有的代码。


总结

多态是面向对象编程中非常重要的概念,它允许我们以统一的方式处理不同类型的对象,从而提高代码的灵活性和可维护性。在 C# 中,多态主要通过虚方法和重写方法实现。

关键点

  • 使用 virtual 关键字定义虚方法。
  • 使用 override 关键字在子类中重写方法。
  • 多态使得代码更具扩展性和可维护性。

附加资源与练习

练习

  1. 创建一个 Vehicle 类,并定义虚方法 Drive。然后创建 CarBike 类,分别重写 Drive 方法。
  2. 扩展图形绘制的案例,添加一个新的图形(如三角形),并实现其 Draw 方法。

进一步学习

  • 了解 C# 中的抽象类和接口,它们也是实现多态的重要工具。
  • 探索 C# 中的方法重载(编译时多态)。

通过掌握多态,你将能够编写更加灵活和强大的面向对象程序。继续加油!