方法重载(Function Overload)_Csharp
很简单的一个概念哈,但是总是拎不清方法重载(Function Overload)具体到底是个什么东西,所以写了本文。
本文就不将运算符重载算在里面了,涉及到一个新的关键词operator
,不讲先。
概念?
函数重载(英语:function overloading)或方法重载,是某些编程语言(如 C++、C#、Java、Swift、Kotlin 等)具有的一项特性,该特性允许创建多个具有不同实现的同名函数。对重载函数的调用会运行其适用于调用上下文的具体实现,即允许一个函数调用根据上下文执行不同的任务。
注意下重载(overload)和重写(overriding),两个概念是不一样的。
方法重载
在C#中,一个类里面可能有两个或者多个同名方法,但是他们的参数数量、类型或顺序不同,这种情况称为方法重载。例下:
class XXX
{
public void Study()
{
//...
}
public void Study(string name)
{
//...
}
public void Study(int age)
{
//...
}
public void Study(string name, int age)
{
//...
}
}
这一堆Study()
方法将会被重载,他们具有相同的名字,但是接受着不同的参数和数量。
那么如何才能做到方法重载呢?
改变方法的参数数量。在下面的例子中,有些方法有一个参数,而有些方法有两个参数;
void Display(int a) { ... } ... void Display(int a, string b) { ... }
改变方法的参数数据类型。在下面的例子中,方法都有相同数量的参数,但参数的数据类型不同,如
int
和string
;void Display(int a) { ... } ... void Display(string a) { ... }
改变方法的参数顺序。如下面的例子,他们都具有相同数量的参数,且数据类型可互相对应,但参数的数据类型顺序不同。
void Display(int a, string b) { ... } ... void Display(string b, int a) { ... }
我铁懒逼,就不展示具体运行效果是什么了。感兴趣的可以自己写个程序,一般的面向对象程序设计语言都可以实现。
构造函数重载
类似于方法重载,构造函数也是可以重载的。而对于重载构造函数,我们需要有两个或多个同名但不同参数数量、数据类型和参数顺序的构造函数,这和方法重载所需条件非常相似。
不明白构造函数是个什么东西的,请看这个 Microsoft docs。
实例:
class Employee
{
public Employee(string firstName, string lastName)
{
...
}
public Employee(int id, string firstName, string lastName)
{
...
}
public Employee(string lastName, string firstName)
{
...
}
...
}
作用?
多个方法用同一个名字,但它们的参数类型、数量和顺序可以不同。调用方法时,根据参数类型、数量和顺序确定具体调用哪个方法体;
重载的最直接作用是方便我们可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写过个函数名或方法名的重复步骤。
注意
- 虽然方法签名包括访问级别、可选修饰符、返回值、方法名和方法参数等,且方法可能具有相同或不同的返回类型,但方法不能通过访问权限、返回类型进行重新加载;
- 对于继承来说,如果某一方法在父类中是访问权限是private(私有方法),那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。