C# 方法重写
介绍
在面向对象编程中,方法重写(Method Overriding)是一个重要的概念,它允许子类重新定义父类中的方法,以实现特定的行为。通过方法重写,我们可以实现多态性,即同一个方法在不同的类中可以有不同的实现。
在 C# 中,方法重写是通过 virtual
和 override
关键字来实现的。父类中的方法使用 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");
}
}
子类:Circle
和 Rectangle
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
提示
通过方法重写,我们可以轻松扩展系统,添加新的图形类型,而无需修改现有的代码。
注意事项
virtual
和override
关键字:只有使用virtual
关键字标记的方法才能被重写,而重写时必须使用override
关键字。new
关键字:如果子类中定义了一个与父类同名的方法,但没有使用override
关键字,编译器会发出警告。可以使用new
关键字来隐藏父类的方法,但这并不是方法重写。base
关键字:在子类中,可以使用base
关键字调用父类中被重写的方法。
csharp
public class Dog : Animal
{
public override void MakeSound()
{
base.MakeSound(); // 调用父类的 MakeSound 方法
Console.WriteLine("The dog barks");
}
}
总结
方法重写是 C# 中实现多态性的重要机制。通过 virtual
和 override
关键字,子类可以重新定义父类中的方法,从而实现不同的行为。这种方法在构建可扩展和可维护的面向对象系统中非常有用。
附加资源与练习
- 练习:创建一个
Vehicle
类,包含一个virtual
方法Drive
。然后创建两个子类Car
和Bicycle
,分别重写Drive
方法,实现不同的驾驶行为。 - 进一步学习:了解 C# 中的抽象类(
abstract
)和接口(interface
),它们与方法重写的关系。
警告
在重写方法时,确保子类中的方法与父类中的方法具有相同的签名(即相同的名称、参数列表和返回类型)。