C# 方法重写

2025年8月26日 | 7 分钟阅读

在 C# 编程语言中,方法重写是一个过程,派生类声明一个与基类中已声明的方法同名、返回类型和参数的方法。它用于实现运行时多态性。它使我们能够为基类已经提供的方法提供特定的实现。这意味着基类定义了一个通用行为,但派生类可以根据需要扩展或完全重新定义该行为。

C# 方法重写示例

让我们举一个例子来演示 C# 中的方法重写。

示例

编译并运行

输出

Sports Car runs at high speed
Electric Car runs silently

说明

在此示例中,我们创建了一个基类 Car,它定义了一个虚拟方法 Drive(),该方法在派生类(如 SpCar 和 EcCar)中使用 override 关键字进行重写。在程序执行期间,方法调用是根据实际对象类型而不是引用类型来解析的。因此,将调用相应的重写方法,并打印出特定的输出。

方法重写的关键字

如果要在 C# 中执行方法重写,必须在基类方法中使用 virtual 关键字,在派生类方法中使用 override 关键字。在 C# 中,我们可以使用 3 种关键字来实现方法重写

1) Virtual 关键字

C# 编程语言中,virtual 关键字或修饰符主要用于基类方法。它用于修改基类方法,以便在派生类中重写该特定的基类方法。

C# 中使用 Virtual 关键字的方法重写示例

让我们举一个例子来说明 C# 中使用 Virtual 关键字的方法重写。

示例

编译并运行

输出

Area: 0

说明

在此示例中,我们创建了一个 Shape 类,其中包含一个返回 0 的虚拟函数 Area(),这表明默认情况下,形状没有面积。在 main() 函数中,实例化了一个 Shape 对象并调用了其 Area() 方法,结果显示为 Area: 0。最后,virtual 关键字使派生类将来能够重写此函数。

2) Override 关键字

在 C# 编程中,override 关键字是一个修饰符,主要用于派生类方法。它提供了基类中已声明为 virtual 和 abstract 的方法的特定实现。它使派生类能够扩展或修改基类中的行为。在运行时,它确保根据实际对象类型而不是引用类型执行合适的方法。

C# 中使用 Override 关键字的方法重写示例

让我们举一个例子来说明 C# 中使用 override 关键字的方法重写。

示例

编译并运行

输出

Rectangle Area: 15

说明

在此示例中,我们创建了一个 Shape 类,其中包含一个返回 0 的虚拟 Area() 函数。之后,Rectangle 类继承自 Shape 类并重写 Area() 函数以返回 Width * Height。在 main() 函数中,实例化了一个宽度为 5、高度为 3 的矩形,调用 Area() 返回 15。

3) Base 关键字

在 C# 中,base 关键字主要用于在派生类中访问基类的成员。使用 base 关键字,我们可以从派生类调用基类的方法或函数。它还在继承期间用于内部调用基类的构造函数

C# 中使用 Base 关键字的方法重写示例

让我们举一个例子来说明 C# 中使用 base 关键字的方法重写。

示例

编译并运行

输出

Employee is working.
Manager is preparing reports.

说明

在此示例中,我们声明了一个 Employee 类,其中包含一个虚拟方法 Work(),该方法将打印默认的工作消息。之后,Manager 类重写 Work() 方法以调用基类 Work(),然后将其消息附加到报告准备中。在 Main() 函数中,我们初始化一个 Manager 对象并调用 Work() 函数,该函数将打印两条消息。

C# 中使用设备的方法重写示例

让我们举一个例子来说明 C# 中使用不同设备的方法重写。

示例

编译并运行

输出

This is a generic device.
This is a smartphone with a touchscreen.
This is a laptop with a physical keyboard.

说明

在此示例中,我们创建了一个 Device 类,其中包含一个虚拟 Describe() 方法。之后,智能手机和笔记本电脑使用 override 关键字对其进行重写。在运行时,实际对象类型(例如 Device、Smartphone 或 Laptop)决定执行哪个版本的 Describe() 方法。

方法重写的规则

C# 中方法重写有几个规则。其中一些如下:

  • 在 C# 方法重写中,可以在派生类中重写方法、属性、索引器或事件。
  • C# 中的静态方法不能被重写。
  • 我们需要在基类方法中使用 virtual 关键字,以便这些方法可以被重写。
  • 我们必须在子类中使用 override 关键字来重写父类方法。
  • base 关键字允许子类调用方法的父类版本。
  • 被重写的方法应与基类中定义的方法具有相同的名称、返回类型和参数。

结论

总之,方法重写使我们能够扩展或修改继承的方法,从而促进运行时多态性和动态行为。我们可以通过使用 Virtual 和 Abstract 确保根据实际对象类型执行正确的方法。这有助于使代码灵活、可扩展且易于使用,因为基类方法可以在派生类中自定义,而无需修改实际实现。

C# 方法重写常见问题

1. C# 中的方法重写是什么?

在 C# 编程语言中,方法重写使子类能够扩展或修改基类方法的行为,以满足其特定要求,同时保持相同的方法签名以实现多态性。

2. 方法重写和方法重载之间有什么区别?

方法重写为继承的方法在子类中提供了全新的实现。另一方面,方法重载是指在同一个类中具有相同名称但不同参数的多个方法。

3. 所有方法都可以被重写吗?

不能,只有那些在基类中声明为 virtual、abstract 或 override 的方法才能被重写。声明为 sealed、static 或 private 的方法不能被重写。

4. base 关键字在方法重写中的作用是什么?

派生类方法中的 base 关键字调用被重写方法的基类版本,这允许派生方法增强基类行为。

5. 方法重写是运行时多态性还是编译时多态性?

在 C# 中,方法重写是一种运行时多态性,因为要调用的方法在运行时根据实际对象类型进行解析。


下一个主题C# Base