方法重载
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 50 课,共 70 课。
方法重载允许你定义多个名称相同但参数列表不同的方法。编译器会根据你提供的参数确定要调用哪个版本。
每个重载方法都必须有唯一的签名,也就是说,参数数量不同或参数类型不同:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}// 编译器会选择合适的版本
Print("Hello"); // 调用 Print(string)
Print("Hi", 3); // 调用 Print(string, int)
Print(42); // 调用 Print(int)重载和可选参数有一个重要区别。使用可选参数时,你只有一个方法来处理多种情况。使用重载时,你有多个独立的方法,可以针对每种情况包含完全不同的逻辑。
请注意,仅返回类型不同并不能让方法变得唯一,你不能有两个仅返回值不同的方法。参数列表必须不同。方法重载是一种编译时多态,也就是说,在编译代码时就会决定调用哪个方法,而不是在运行时决定。
挑战
简单让我们构建一个多功能计算器类,展示方法重载的强大之处。你将创建多个版本的计算方法,以处理不同的情况,从简单的双数运算到更复杂的计算,并且这些方法都使用直观易懂的名称。
你要将代码分别写在两个文件中:
Calculator.cs:在MathTools命名空间中创建一个Calculator类,其中包含名称相同但参数不同的重载方法:Multiply:创建三个重载版本:- 一个接收两个
int参数,并以int返回它们的乘积的方法 - 一个接收三个
int参数,并以int返回它们的乘积的方法 - 一个接收两个
double参数,并以double返回它们的乘积的方法
- 一个接收两个
Describe:创建两个重载版本:- 一个接收
int,并返回"Integer: {value}"的方法 - 一个接收
double,并返回"Double: {value}"的方法
- 一个接收
Program.cs:在主文件中创建一个Calculator实例,并演示编译器如何根据你提供的参数自动选择正确的重载方法。
你会收到 4 个输入:
- 第一个整数(例如,
5) - 第二个整数(例如,
4) - 第三个整数(例如,
3) - 一个小数(例如,
2.5)
使用计算器执行以下运算,并将每个结果单独打印在一行:
- 将前两个整数相乘(使用接收两个 int 的版本)
- 将三个整数相乘(使用接收三个 int 的版本)
- 将第一个整数和小数相乘(使用接收两个 double 的版本)
- 描述第一个整数(使用接收 int 的版本)
- 描述小数(使用接收 double 的版本)
例如,如果输入是 5、4、3 和 2.5,输出应为:
20
60
12.5
Integer: 5
Double: 2.5注意,你使用不同的参数类型和数量调用 Multiply 和 Describe,但编译器每次都能准确判断该使用哪个版本。这就是编译时多态:选择发生在代码编译时,而不是运行时!
亲手试试
using System;
using MathTools;
class Program
{
public static void Main(string[] args)
{
// 读取输入
int firstInt = Convert.ToInt32(Console.ReadLine());
int secondInt = Convert.ToInt32(Console.ReadLine());
int thirdInt = Convert.ToInt32(Console.ReadLine());
double decimalNum = Convert.ToDouble(Console.ReadLine());
// TODO: 创建一个 Calculator 实例
// TODO: 用两个整数调用 Multiply,并打印结果
// TODO: 用三个整数调用 Multiply,并打印结果
// TODO: 用第一个整数和小数调用 Multiply,并打印结果
// TODO: 用第一个整数调用 Describe,并打印结果
// TODO: 用小数调用 Describe,并打印结果
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器