C# 中的多态性

2025年8月21日 | 8 分钟阅读

多态(polymorphism)这个词是两个词的组合,“poly”+“morphism”。poly 这个词的意思是,morphism 的意思是形态。这意味着一个任务可以用多种形式来执行。它是一个希腊词。它提供了一种使用相同函数名实现不同目的的方法。在面向对象编程(OOPs)中,它使用了三个主要概念:继承、封装和多态。它提高了代码的灵活性、可重用性和可维护性。

多态的简单示例

让我们举一个说明性的例子来定义 C# 中的多态。

示例

编译并运行

输出

Sum of num1 and num2 = 75
Concatenated string = overloading

说明

在这个例子中,我们使用了两个整数和字符串数据类型。之后,我们使用了 (+) 运算符。第一个 (+) 运算符用于将两个数字相加,第二个 (+) 运算符用于连接两个字符串操作数。最后,我们使用 Console.WriteLine() 函数来打印输出。

多态性类型

C# 中主要有两种类型的多态。

Polymorphism in C#

在这里,我们将逐一讨论这些多态。

编译时多态

在 C# 编程语言中,编译时多态也称为早期绑定和静态多态。它使我们能够定义多个具有相同名称但参数不同的方法。

Polymorphism in C#

它是通过在 C# 中使用方法重载和运算符重载来实现的。

注意:当一个方法调用在程序编译过程中决定实际的函数时,这被称为编译时多态。

a) 函数重载

在 C# 中,函数重载是面向对象编程的一个重要概念。它提供了一种让一个类拥有多个同名但参数不同的方法。函数重载可以通过改变参数的数量或改变参数的类型来实现。

使用函数重载的 C# 编译时多态示例

让我们举一个简单的例子来说明在 C# 中使用函数重载的编译时多态。

示例

编译并运行

输出

The Sum of the two numbers is 300
 The Sum of the three numbers is 600
 The Sum of two floating numbers is 51.2

说明

在这个例子中,我们定义了一个名为 Number 的类,其中包含三个同名但参数不同的方法。之后,我们在主方法中创建该类 (Number) 的一个实例,并调用该方法 (Addition) 三次。最后,我们使用 Console.WriteLine() 函数来打印输出。

b) 运算符重载

在 C# 中,运算符重载允许同一个运算符执行不同的操作。它是一种用户定义的数据类型。可以通过使用诸如 +、-、*、==、<<、>> 等多种运算符来实现。如果我们要使用运算符重载,C# 中至少有一个操作数应该是用户定义的数据类型。

使用运算符重载的 C# 编译时多态示例

让我们举一个例子来说明在 C# 中使用运算符重载的编译时多态。

示例

编译并运行

输出

6 + 8i

说明

在这个例子中,我们定义了一个名为 Comp 的类,其中包含两个公共整型变量(real 和 imag)和三个方法。我们使用一个构造函数来设置 real 或 imag 的值,然后使用重载的 + 运算符方法来将两个 Comp 对象相加。之后,使用一个 Show() 方法来显示复数。在主方法中,我们创建了两个复数,并使用重载的 + 运算符将它们相加,然后显示结果。

运行时多态

在 C# 编程语言中,运行时多态也称为动态多态或后期绑定。当被执行的方法是在程序运行时确定的,就会发生这种情况。它是通过方法重写来实现的,其中派生类提供了对基类中定义的虚方法的自己的实现。

a) 函数重写

在 C# 中,函数重写是面向对象编程的一个关键特性,它使得派生类可以重新定义一个已经在其基类中定义的方法。基类方法应使用 virtual 关键字,而派生类应使用 override 关键字来提供它们的实现。它使得子类能够为父类中已经定义的方法提供特定的行为。

使用函数重写的 C# 运行时多态示例

让我们举一个例子来说明在 C# 中使用函数重写的运行时多态。

示例

编译并运行

输出

The dog barks

说明

在这个例子中,我们定义了一个名为 Animal 的基类,其中包含虚函数 Speak()。之后,我们创建了一个派生类 Dog,它继承自基类并访问基类的特性。在主方法中,我们创建了派生类 (Dog) 的一个实例,并调用 Speak() 方法来打印输出。

b) 虚方法

在 C# 编程语言中,虚方法定义在基类内部。virtual 关键字用于创建一个虚方法。它被用作基类成员,以指定该基类成员可以在派生类中被重写。override 关键字应用于派生类,以提供对被声明为虚的基类成员的新实现。

C# 中的虚方法示例

让我们举一个简单的例子来定义在 C# 中使用虚方法的方法重写。

示例

编译并运行

输出

This is the shape Circle
This is the shape square

说明

在这个例子中,我们定义了一个名为 Shape 的类,其中包含虚方法 Draw()。之后,我们创建了一个派生类 Square,它继承自基类并访问基类的特性。在主方法中,我们创建了 Shape 类的一个实例,并调用 Draw() 方法来打印输出。

C# 中多态的用例

C# 中多态有几个用例。其中一些如下

  • 它允许我们在基类中编写通用代码,并在派生类中修改它。
  • 它基于对象类型,帮助我们在运行时选择执行哪个方法。
  • 通过在基类中定义共同行为并进行修改,有助于减少代码重复。
  • 它允许我们用同一个接口实现多个类,并提供它们各自的功能。

编译时多态和运行时多态的区别

C# 中的编译时多态和运行时多态有几个区别。一些主要区别如下

编译时多态运行时多态
它也被称为早期绑定。它也被称为后期绑定。
方法调用在代码编译期间决定。方法调用在程序执行期间决定。
它是通过方法重载或运算符重载实现的。它是通过方法重写实现的。
在编译时多态中,不涉及继承。运行时多态涉及继承。
灵活性较低。灵活性较高。

结论

总之,C# 多态是任何开发者创建软件应用程序的关键因素。它是 C# OOP 的主要支柱之一。它提供了一种使用相同函数名实现不同目的的方法。它有助于提高代码的可重用性、灵活性和可维护性。

C# 多态常见问题解答

1) C# 中的多态是什么?

在 C# 中,多态(polymorphism)是两个词的组合,“poly”+“morphism”。poly 这个词的意思是,morphism 的意思是形态。它意味着一件事物有多种形态。它允许使用相同的函数名实现不同的目的。

2) C# 中有哪些不同类型的多态?

C# 中有两种类型的多态。

  • 编译时多态
  • 运行时多态

3) C# 中用于运行时多态的关键字有哪些?

virtual、override 和 abstract 关键字用于实现运行时多态。

4) 为什么多态在 C# 中很重要?

多态是任何开发者创建软件应用程序的关键因素。它提供了一种使用相同函数名实现不同目的的方法。它提高了代码的灵活性、可维护性和可重用性。

5) C# 中重载和重写方法的区别是什么?

方法重载和方法重写的区别如下。

方法重载

方法重载是编译时多态的一种形式,允许定义多个同名但签名不同的方法。

方法重写

方法重写是运行时多态的一种形式,允许定义多个具有相同签名的同名函数。它允许子类重写基类的方法。


下一个主题C# Sealed