函数重载的用途/优点是什么?
答案 0 :(得分:21)
IMO,主要好处是在逻辑上执行非常相似的任务的方法/功能的命名的一致性,并且通过接受不同的参数略有不同。这允许在多个实现中重用相同的方法名称。
e.g。重载:(好)
function Person[] FindPersons(string nameOfPerson) { ... }
function Person[] FindPersons(date dateOfBirth) { ... }
function Person[] FindPersons(int age, string dogsName) { ... }
优于“唯一命名”功能:(更糟)
function Person[] FindPersonsByName(string nameOfPerson) { ... }
function Person[] FindPersonsByDOB(date dateOfBirth) { ... }
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... }
这样编写调用/使用这些函数的客户端的编码器可以在更高层次的概念思维中运行(“我需要找到一个人”)并且不需要记住/找到一个人为的函数名称。 / p>
使用静态类型,编译器将根据使用参数匹配适用的重载。对于动态类型,在运行时会发生同样的匹配,如果找不到合适的匹配,可能会导致失败。
答案 1 :(得分:7)
非常有效的问题。
您可以获得命名的一致性,但代价是关于确切实施的歧义。
真正的问题是人类记忆 方法名称,对吗?我们找到了 更容易记住的名字 常用。
和打字的经济性,允许 更短的方法名称?更少的不同 名称的意思是(数学上) 名称本身携带的信息较少。
这两个问题不应该是任何问题,IDE可以根据前几个字符和参数/返回类型快速查找/猜测/插入方法名称。
但我确实认为编码的准确性和成本都有成本。
答案 2 :(得分:6)
重载是多态的一种形式。它允许程序员编写函数,在不改变名称的情况下对不同类型的数据进行概念上相同的操作。 (它还允许程序员编写函数来根据参数做出概念上不同的事情,但这是一个真正的坏主意。)
这允许符号的一致性,这对于读取和编写代码都是好的。 I / O是一种非常常见的用途。在大多数常用语言中,有一个函数或运算符可以输出您喜欢的任何内容,例如C中的printf()
和kin,C ++中的operator<<()
,我使用的旧BASICS中的PRINT
使用,无论如何。需要printint()
,printstring()
,printfloat()
等功能的语言从未流行过。
它适用于C ++模板和任何其他构造,在编写代码时您不一定知道变量类型是什么。
答案 3 :(得分:4)
您的功能可能需要使用一些可选的详细信息。 例如,以下示例希望将成员添加到Members对象,并提供用户知道的任何详细信息。这里age是创建成员的最小细节,age和memberOf是可选的。 [注意:代码片段中未提供函数定义。]
public class Members
{
public System.Collections.Generic.List<Member> TeamMembers;
public AddMember(Member m) {}
public AddMember(string name) {}
public AddMember(string name, int age) {}
public AddMember(string name, int age, string[] memberOf) {}
public class Member
{
public string Name { get; set; }
public int Age { get; set; }
public string[] MemberOf { get; set; }
}
}
您可能希望您的方法适用于多种类型的对象。 恩。 Console.WriteLine()方法能够在控制台上写入空行,bool,int,string,char [],float等。由于函数重载,这是可能的。
答案 4 :(得分:3)
函数/方法有时可以采用不同类型的参数来完成它的工作。这是函数重载的时间。否则,您必须具有相同功能的不同功能,这是令人困惑和不良做法。
答案 5 :(得分:1)
它根据对象的属性为同一对象提供多种行为。
例如,名为addUs(a,b)
的方法会添加a
和b
。
所以定义将是:
int addUs(int a, int b){
return a+b;
}
但是现在如果你想让你的论点成为一个类的对象说:
class Demo{
int height;
int width;
}
您希望相同的函数addUs()
返回一个新对象,该对象具有属性height和width,其值为height&amp;的总和。传递的2个参数的宽度。
所以现在的定义是:
Demo addUs(Demo a Demo b){
Demo this;
this.height = a.height + b.height;
this.width = a.width + b.width;
return this;
}
答案 6 :(得分:1)
有时,根据可用的上下文和输入,您有多种方法可以完成相同的操作。对于类型严格的静态语言,函数定义可能非常严格,需要提前明确定义。
构造函数通常是最好的经典示例。如果你正在构建一个复杂的对象并且没有所有的部分,你仍然希望能够将你拥有的东西传递给构造函数并让其填充其余部分。而你拥有的东西可能会有很大差异,需要以不同的方式定义为构造函数的参数。
答案 7 :(得分:1)
ad-hoc polymorphism 是好东西!!
答案 8 :(得分:0)
您可能希望在代码中使用不同的参数执行类似的操作。如果你必须给每个函数一个不同的名字,那么代码的可读性会非常糟糕。
答案 9 :(得分:0)
它是同名函数的机制,但在不同的实例上执行不同的任务。我们很容易记住常用的名称。