C# Base

2025 年 9 月 5 日 | 阅读 6 分钟

在 C# 编程语言中,`base` 关键字用于从派生类中访问基类成员。当父类实现被重写时,或者在对象创建期间需要调用父类构造函数时,它有助于调用父类的实现。`base` 类关键字只能在实例方法、构造函数或实例属性访问器中使用。

语法

它具有以下语法:

在这个语法中,

  • MemberName:它用于访问基类成员。
  • :base(parameter_list):它用于派生类构造函数中,以调用基类构造函数。

C# `base` 关键字访问基类字段

C# 编程中,我们可以使用 `base` 关键字在派生类内部访问基类的字段。如果基类和派生类包含相同的字段,这将很有用。如果派生类没有定义相同的字段,则无需使用 `base` 关键字。基类字段可以直接由派生类访问。

C# `base` 关键字访问基类字段的示例

让我们看看 C# 中 `base` 关键字的一个简单示例,它访问基类的字段。

示例

编译并运行

输出

white
black

说明

在这个例子中,我们演示了字段隐藏,其中 `Dog` 拥有自己的 `color` 字段,隐藏了 `Animal` 的 `color`。之后,`base.color` 用于访问 `Animal` 中的“white”,而 `color` 用于访问 `Dog` 中的“black”。

C# `base` 关键字调用基类方法

在 C# 中,我们可以使用 `base` 关键字调用基类方法。如果基类和派生类定义相同的方法,这将很有用。换句话说,如果方法被重写,或者如果派生类没有定义相同的方法,则无需使用 `base` 关键字。基类方法可以直接由派生类方法调用。

C# `base` 关键字调用基类方法的示例

让我们看看 `base` 关键字的一个简单示例,它调用基类的方法。

示例

编译并运行

输出

eating...
eating bread...

说明

在这个例子中,我们演示了使用 `base` 关键字从派生类中的重写方法调用基类方法。在这里,`Dog` 类重写了 `eat()` 方法,首先调用基类 `Animal` 方法打印“eating...”,然后打印其消息“eating bread...”。

C# `base` 关键字使用构造函数链

在 C# 编程语言中,当一个类被继承时,基类 构造函数 会在派生类构造函数之前自动调用。`base` 关键字也可以明确用于调用基类的特定构造函数。

C# `base` 关键字使用构造函数链的示例

让我们以一个例子来说明 C# 中使用构造函数链的 `base` 关键字。

示例

编译并运行

输出

animal...
dog...

说明

在这个例子中,我们演示了继承中的构造函数链,其中实例化一个 `Dog` 对象最初调用 `Animal` 构造函数,它打印“animal...”,然后调用 `Dog` 构造函数,它打印“dog...”。

C# 中带参数的构造函数链

在 C# 中,当基类定义带参数的构造函数时,我们应该显式调用派生类以确保正确初始化。这通过在派生类构造函数中使用 `base` 关键字调用带参数的基类构造函数,后跟相应的参数来实现。它确保在派生类构造函数执行之前,基类使用所需参数正确初始化。

C# 带参数的构造函数链示例

让我们以一个例子来说明 C# 中带参数的构造函数链。

示例

编译并运行

输出

Animal constructor: Buddy
Dog constructor

说明

在这个例子中,我们演示了带参数的构造函数链,其中初始化 `Dog("Buddy")` 首先通过 `base(name)` 调用 `Animal` 的构造函数以打印“Animal constructor: Buddy”,然后执行 `Dog` 构造函数以打印“Dog constructor”。

C# 中 `base` 和 `this` 关键字的区别

C# 中 `base` 和 `this` 关键字之间存在一些区别。一些主要区别如下:

`this` 关键字

  • “this”指代码正在执行的类的当前实例。
  • 它允许访问直接类中的成员(字段、属性和方法),包括基类中任何被重写或隐藏的成员。
  • 当使用 `this.Method()` 调用方法时,它会调用该方法最派生的重写。

`base` 关键字

  • `base` 关键字是对当前类的直接基类的引用。
  • 它指基类中声明的成员,重写直接类中的任何重写或隐藏。
  • 当使用 `base.Method()` 调用方法时,即使在派生类中重写了该方法,它也会调用父类版本。

C# 使用 `base` 和 `this` 关键字的示例

让我们以一个例子来说明 C# 中的 `base` 和 `this` 关键字。

示例

编译并运行

输出

Shape Area: 0
Rectangle Area (overridden): 20
Shape Area: 0
This is a Shape
This is a Rectangle

说明

在这个例子中,我们有一个 `Rectangle` 类,它继承自 `Shape` 并重写了 `Area()` 方法,同时使用 `new` 隐藏了 `PrintType()` 方法。在 `ShowInfo()` 方法内部,`base` 和 `this` 都用于演示如何分别访问基类方法 (`base.Area()`、`base.PrintType()`) 和派生类方法 (`this.PrintType()`、被重写的 `Area()`)。

结论

总之,`base` 关键字是 C# 面向对象编程的要求,它使派生类能够与其直接基类通信。`base` 关键字用于调用基类构造函数,访问基类成员和属性,并消除有关可能隐藏基类成员的派生成员的问题。在正确的上下文中使用它能够实现更清晰的继承层次结构、代码重用以及减少复杂类层次结构中成员访问的混淆。

C# `base` 常见问题

1) 我们可以在派生类中使用多个构造函数吗?如何选择要调用的基类构造函数?

是的,我们可以在派生类中拥有多个构造函数;可以通过使用 `base()` 和相应的所需参数从每个构造函数调用不同的基类构造函数。

2) 如果基类缺少公共无参数构造函数会发生什么?

派生类应该通过 `base` 关键字显式调用基类构造函数,从可用的参数签名中进行选择。否则,它将无法编译。

3) 什么时候应该在方法中使用 `base` 关键字?

如果我们要调用基类中已被派生类重写或隐藏的方法或属性,则使用 `base` 关键字。

4) C# 允许多重基类继承吗?

不,C# 不允许多重类继承。我们只能从一个基类继承,但可以从多个接口继承。

5) `base` 可以应用于字段和属性吗?

是的,`base` 可以调用基类中可从派生类访问的字段、属性和方法。它通常在派生类覆盖基类成员时应用。


下一主题C# 多态性