“重载”/“过载”/“重载”是什么意思?

时间:2008-11-14 12:58:17

标签: language-agnostic overloading

“重载”/“过载”对于编程意味着什么?

8 个答案:

答案 0 :(得分:22)

这意味着您提供的函数(方法或运算符)具有相同的名称,但具有不同的签名。 例如:

void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);

答案 1 :(得分:15)

基本概念

重载或“方法重载”是具有多个具有相同名称但具有不同参数的方法的概念的名称。

例如c#中的System.DateTime类有多个ToString方法。标准ToString使用系统的默认文化将datetime转换为string:

new DateTime(2008, 11, 14).ToString(); // returns "14/11/2008" in America

同一方法的另一个重载允许用户自定义格式:

new DateTime(2008, 11, 14).ToString("dd MMM yyyy"); // returns "11 Nov 2008"

有时参数名称可能相同,但参数类型可能不同:

Convert.ToInt32(123m);

时将小数转换为int
Convert.ToInt32("123");

将字符串转换为int。

重载决议

为了找到要调用的最佳重载,编译器执行名为“重载决策”的操作。对于第一个示例,编译器只需匹配参数计数即可找到最佳方法。对于第二个示例,如果传递十进制参数,编译器会自动调用replace方法的十进制版本,如果传递字符串参数,则调用字符串版本。从可能的输出列表中,如果编译器找不到合适的输出,您将得到编译器错误,如“最佳过载与参数不匹配......”。

您可以find获取有关不同编译器如何执行重载解析的大量信息。

答案 2 :(得分:6)

当一个函数有多个签名时,它会被重载。这意味着您可以使用不同的参数类型调用它。例如,您可能具有在屏幕上打印变量的功能,您可以为不同的参数类型定义它:

void print(int i);
void print(char i);
void print(UserDefinedType t);

在这种情况下,函数print()将有三个重载。

答案 3 :(得分:4)

这意味着具有相同功能的不同版本,它们采用不同类型的参数。这样的功能是“过载的”。例如,采用以下功能:

void Print(std::string str) {
  std::cout << str << endl;
}

您可以使用此功能将字符串打印到屏幕上。但是,当您想要打印整数时,不能使用此功能,您可以再创建该函数的第二个版本,如下所示:

void Print(int i) {
  std::cout << i << endl;
}

现在函数被重载了,函数的哪个版本将取决于你给出的参数。

答案 4 :(得分:2)

其他人已经回答了过载的原因。当你开始时,它会被覆盖/覆盖混淆。

与重载相反,重写是在子类(或子类)中定义具有相同签名的方法,该方法将覆盖父类实现。某些语言需要显式指令,例如C ++中的virtual成员函数或Delphi和C#中的override

using System;

public class DrawingObject
{
    public virtual void Draw()
    {
        Console.WriteLine("I'm just a generic drawing object.");
    }
}

public class Line : DrawingObject
{
    public override void Draw()
    {
        Console.WriteLine("I'm a Line.");
    }
}

答案 5 :(得分:1)

重载方法是指具有多个参数数量和类型选项的方法。例如:

foo(foo)

foo(foo, bar)

两者都会做相对相同的事情,但其中一个有更多选项的第二个参数

您也可以采用相同的方法采用不同的类型

int Convert(int i)
int Convert(double i)
int Convert(float i)

答案 6 :(得分:0)

就像在常见用法中一样,它指的是某些东西(在这种情况下,是一个方法名称),不止一个工作。

答案 7 :(得分:0)

重载是穷人的multimethods from CLOS and other languages版本。这是令人困惑的。

覆盖是通常的OO。它与继承有关,我们称之为重新定义(例如在https://stackoverflow.com/users/3827/eed3si9n's answer Line中提供了Draw()的专门定义。