很简单的一个概念哈,但是总是拎不清方法重载(Function Overload)具体到底是个什么东西,所以写了本文。

本文就不将运算符重载算在里面了,涉及到一个新的关键词operator,不讲先。

概念?

函数重载(英语:function overloading)或方法重载,是某些编程语言(如 C++C#JavaSwiftKotlin 等)具有的一项特性,该特性允许创建多个具有不同实现的同名函数。对重载函数的调用会运行其适用于调用上下文的具体实现,即允许一个函数调用根据上下文执行不同的任务。

——Wikipedia

注意下重载(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()方法将会被重载,他们具有相同的名字,但是接受着不同的参数和数量。

那么如何才能做到方法重载呢?

  1. 改变方法的参数数量。在下面的例子中,有些方法有一个参数,而有些方法有两个参数;

    void Display(int a) 
    {
      ...
    } 
    ...
    void Display(int a, string b) 
    {
      ...
    }
  2. 改变方法的参数数据类型。在下面的例子中,方法都有相同数量的参数,但参数的数据类型不同,如intstring

    void Display(int a) 
    {
      ...
    } 
    ...
    void Display(string a) 
    {
      ...
    }
  3. 改变方法的参数顺序。如下面的例子,他们都具有相同数量的参数,且数据类型可互相对应,但参数的数据类型顺序不同。

    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)
    {
        ...
    }
    ...
}

作用?

  • 多个方法用同一个名字,但它们的参数类型、数量和顺序可以不同。调用方法时,根据参数类型、数量和顺序确定具体调用哪个方法体;

  • 重载的最直接作用是方便我们可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写过个函数名或方法名的重复步骤。

注意

  1. 虽然方法签名包括访问级别、可选修饰符、返回值、方法名和方法参数等,且方法可能具有相同或不同的返回类型,但方法不能通过访问权限、返回类型进行重新加载;
  2. 对于继承来说,如果某一方法在父类中是访问权限是private(私有方法),那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。