【发布时间】:2010-07-27 13:08:42
【问题描述】:
函数重载有什么用处/优点?
【问题讨论】:
标签: language-agnostic oop overloading
函数重载有什么用处/优点?
【问题讨论】:
标签: language-agnostic oop overloading
IMO,主要好处是在逻辑上执行非常相似的任务的方法/函数的命名保持一致,并且通过接受不同的参数略有不同。这允许在多个实现中重复使用相同的方法名称。
例如重载:(好)
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) { ... }
这样,编写调用/使用这些函数的客户端的编码人员可以在更高层次的概念思维(“我需要找一个人”)上进行操作,并且不需要记住/定位一个人为的函数名称。
使用静态类型,编译器将根据使用参数匹配适用的重载。对于动态类型,同样的匹配会在运行时发生,如果找不到合适的匹配,可能会导致失败。
【讨论】:
overloading 有时被称为adhoc polymorphicism。
非常有效的问题。
您可以在命名上保持一致,但代价是确切实施不明确。
真正的问题是人类的记忆力 方法名称,对吧?我们找到了 更容易记住的名字 常用。
和打字的经济性,允许 更短的方法名称?更少的不同 名称意味着(数学上) 名称本身携带的信息较少。
这两个问题不应该是任何问题,IDE 会根据前几个字符和参数/返回类型快速查找/猜测/插入方法名称。
但我确实认为编码的准确性是有代价的,但也有好处。
【讨论】:
重载是多态的一种形式。它允许程序员编写函数,在概念上对不同类型的数据执行相同的操作,而无需更改名称。 (它还允许程序员编写函数来根据参数在概念上做不同的事情,但这是一个真正的坏主意。)
这允许符号的一致性,这对阅读和编写代码都有好处。 I/O 是一种非常常见的用途。在大多数常用语言中,都有一个函数或运算符可以输出您喜欢的任何内容,例如 C 中的 printf() 和 kin,C++ 中的 operator<<(),我以前使用的旧 BASICS 中的 PRINT,等等。需要 printint()、printstring()、printfloat() 等函数的语言从未流行过。
它非常适用于 C++ 模板和任何其他在编写代码时您不一定知道变量类型是什么的构造。
【讨论】:
您的函数可能需要处理一些可选细节。 例如,下面的示例想要向 Members 对象添加一个成员,其中包含用户知道的任何详细信息。这里 age 是创建成员的最小细节,age 和 memberOf 是可选的。 [注:sn-p代码中没有提供函数定义。]
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 等。由于函数重载,这成为可能。
【讨论】:
函数/方法有时能够采用不同类型的参数来完成它的工作。这是函数重载的时候了。否则,您将不得不为相同的功能使用不同的功能,这是令人困惑和不好的做法。
【讨论】:
有时,根据可用的上下文和输入,您有多种方法可以完成同一件事。对于类型严格的静态语言,函数定义可能非常严格,需要提前明确定义。
构造函数通常是最好的经典例子。如果您正在构建一个复杂的对象并且没有所有部分,您仍然希望能够将您拥有的内容传递给构造函数并让它填充其余部分。你所拥有的可能会有很大的不同,需要以不同的方式定义为构造函数的参数。
【讨论】:
ad-hoc polymorphism 是个好东西!!
【讨论】:
它针对对象的属性为同一对象提供多种行为。
例如,名为addUs(a,b) 的方法添加了a 和b。
所以定义是:
int addUs(int a, int b){
return a+b;
}
但是现在如果你希望你的参数是一个类的对象说:
class Demo{
int height;
int width;
}
您希望相同的函数 addUs() 返回一个新对象,该对象的高度和宽度属性的值是传递的 2 个参数的高度和宽度之和。
所以现在的定义是:
Demo addUs(Demo a Demo b){
Demo this;
this.height = a.height + b.height;
this.width = a.width + b.width;
return this;
}
【讨论】:
您可能希望在具有不同参数的代码中执行类似的操作。如果你必须给每个函数一个不同的名字,代码的可读性会很差。
【讨论】:
这是同名函数在不同实例上执行不同任务的机制。我们很容易记住常用的名称。
【讨论】: