Stu*_*tLC 21

IMO,主要好处是在逻辑上执行非常相似的任务的方法/功能的命名的一致性,并且通过接受不同的参数略有不同.这允许在多个实现中重用相同的方法名称.

例如重载:(好)

function Person[] FindPersons(string nameOfPerson) { ... }
function Person[] FindPersons(date dateOfBirth) { ... }
function Person[] FindPersons(int age, string dogsName) { ... }
Run Code Online (Sandbox Code Playgroud)

优于"唯一命名"功能:(更糟)

function Person[] FindPersonsByName(string nameOfPerson) { ... }
function Person[] FindPersonsByDOB(date dateOfBirth) { ... }
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... }
Run Code Online (Sandbox Code Playgroud)

这样编写调用/使用这些函数的客户端的编码器可以在更高级别的概念思维("我需要找到一个人")中操作,而不需要记住/定位一个人为的功能名称.

使用静态类型,编译器将根据使用参数匹配适用的重载.对于动态类型,在运行时会发生同样的匹配,如果找不到合适的匹配,可能会导致失败.

  • 我同意,但你需要小心,如果由于某种原因现在你想创建FindPerson(字符串城市)所以我不确定这是最好的例子...参数仍然有效虽然 (2认同)

San*_*har 7

非常有效的问题.

您可以获得命名的一致性,但代价是确切实现模糊性.

  • 真正的问题是方法名称的人类记忆,对吧?我们发现更容易记住常用的名称.

  • 打字的经济性,允许更短的方法名称?较少的不同名称(数学上)意味着名称本身携带的信息较少.

这两个问题不应该是任何问题,IDE可以根据前几个字符和参数/返回类型快速查找/猜测/插入方法名称.

但我确实认为编码的准确性和成本是有代价的.


Dav*_*ley 6

重载是多态的一种形式.它允许程序员编写函数,在不改变名称的情况下对不同类型的数据进行概念上相同的操作.(它还允许程序员编写函数来根据参数做出概念上不同的事情,但这是一个真正的坏主意.)

这允许符号的一致性,这对于读取和编写代码都是好的.I/O是一种非常常见的用途.在大多数常用的语言中,有一个函数或运算符可以输出你喜欢的任何东西,比如printf()C operator<<()中的kin,C++ PRINT中的kin,以及我曾经使用过的旧BASICS,无论如何.需要像函数的语言printint(),printstring(),printfloat()等从来没有流行起来.

它适用于C++模板和任何其他构造,在编写代码时您不一定知道变量类型是什么.