跳到主要内容

C# 方法重写

介绍

在面向对象编程中,方法重写(Method Overriding)是一个重要的概念,它允许子类重新定义父类中的方法,以实现特定的行为。通过方法重写,我们可以实现多态性,即同一个方法在不同的类中可以有不同的实现。

在 C# 中,方法重写是通过 virtualoverride 关键字来实现的。父类中的方法使用 virtual 关键字标记为可重写,而子类中的方法使用 override 关键字来重写父类的方法。

基本语法

父类中的 virtual 方法

在父类中,使用 virtual 关键字声明一个方法,表示该方法可以在子类中被重写。

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

子类中的 override 方法

在子类中,使用 override 关键字重写父类中的 virtual 方法。

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

调用重写的方法

当通过子类的实例调用重写的方法时,将执行子类中的方法实现。

csharp
Animal myDog = new Dog();
myDog.MakeSound(); // 输出: The dog barks

实际案例

假设我们有一个简单的图形绘制系统,其中包含不同类型的图形(如圆形、矩形)。我们可以通过方法重写来实现不同图形的绘制逻辑。

父类:Shape

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

子类:CircleRectangle

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

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

使用多态性绘制图形

csharp
Shape[] shapes = new Shape[]
{
new Circle(),
new Rectangle()
};

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

输出:

Drawing a circle
Drawing a rectangle
提示

通过方法重写,我们可以轻松扩展系统,添加新的图形类型,而无需修改现有的代码。

注意事项

  1. virtualoverride 关键字:只有使用 virtual 关键字标记的方法才能被重写,而重写时必须使用 override 关键字。
  2. new 关键字:如果子类中定义了一个与父类同名的方法,但没有使用 override 关键字,编译器会发出警告。可以使用 new 关键字来隐藏父类的方法,但这并不是方法重写。
  3. base 关键字:在子类中,可以使用 base 关键字调用父类中被重写的方法。
csharp
public class Dog : Animal
{
public override void MakeSound()
{
base.MakeSound(); // 调用父类的 MakeSound 方法
Console.WriteLine("The dog barks");
}
}

总结

方法重写是 C# 中实现多态性的重要机制。通过 virtualoverride 关键字,子类可以重新定义父类中的方法,从而实现不同的行为。这种方法在构建可扩展和可维护的面向对象系统中非常有用。

附加资源与练习

  1. 练习:创建一个 Vehicle 类,包含一个 virtual 方法 Drive。然后创建两个子类 CarBicycle,分别重写 Drive 方法,实现不同的驾驶行为。
  2. 进一步学习:了解 C# 中的抽象类(abstract)和接口(interface),它们与方法重写的关系。
警告

在重写方法时,确保子类中的方法与父类中的方法具有相同的签名(即相同的名称、参数列表和返回类型)。