【问题标题】:What is the use/advantage of function overloading?函数重载的用途/优点是什么?
【发布时间】:2010-07-27 13:08:42
【问题描述】:

函数重载有什么用处/优点?

【问题讨论】:

    标签: language-agnostic oop overloading


    【解决方案1】:

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

    这样,编写调用/使用这些函数的客户端的编码人员可以在更高层次的概念思维(“我需要找一个人”)上进行操作,并且不需要记住/定位一个人为的函数名称。

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

    【讨论】:

    • 我同意,但是如果出于某种原因现在要创建 FindPerson(String city) 则需要小心,所以我不确定这是最好的例子...尽管参数仍然有效
    • 真的很好的解释..谢谢你提高我的知识,先生:)你能不能也解释一下“以同样的方式使用方法覆盖?\”
    • @iPatel - 覆盖是subtype polymorphicism 的推动者,在虚拟类方法(通常是抽象的)或接口中实现 - 请查看维基百科链接中的示例。还有see here。顺便说一句,overloading 有时被称为adhoc polymorphicism
    • @Alston 我不相信这里提到了任何内存节省,并且重载不会带来任何内存好处 - 重载只是为了方便开发人员允许他们重用代码中相同的函数名称符号,前提是参数签名不同。从编译器的角度来看,它会将每个重载视为不同且独立的。
    • @StuartLC 对不起,我误会了。
    【解决方案2】:

    非常有效的问题。

    您可以在命名上保持一致,但代价是确切实施不明确

    • 真正的问题是人类的记忆力 方法名称,对吧?我们找到了 更容易记住的名字 常用。

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

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

    但我确实认为编码的准确性是有代价的,但也有好处。

    【讨论】:

      【解决方案3】:

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

      这允许符号的一致性,这对阅读和编写代码都有好处。 I/O 是一种非常常见的用途。在大多数常用语言中,都有一个函数或运算符可以输出您喜欢的任何内容,例如 C 中的 printf() 和 kin,C++ 中的 operator<<(),我以前使用的旧 BASICS 中的 PRINT,等等。需要 printint()printstring()printfloat() 等函数的语言从未流行过。

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

      【讨论】:

        【解决方案4】:
        1. 基于参数的同一函数的多种行为。
        2. 您的函数可能需要处理一些可选细节。 例如,下面的示例想要向 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; }
              }
          }
          
        3. 您可能希望您的方法适用于多种类型的对象。 前任。 Console.WriteLine() 方法能够在控制台上写入空行、bool、int、string、char[]、float 等。由于函数重载,这成为可能。

        【讨论】:

        • 默认参数不是更适合这个例子吗?我不认为这是对函数重载的良好使用,尤其是当您必须复制代码或在更复杂的方法中调用更简单的方法(使用更少的参数)时。
        • 默认参数可以为添加更多参数提供答案。但这里的本质是方法重载允许您根据参数的类型和插入的参数数量执行完全不同的代码块(方法)。在 AddMember 的前两个变体中,您可以添加 Member 对象作为参数或字符串;他们的执行可能会走不同的路线。例如,将此功能与 Console.Write() 方法进行比较。
        【解决方案5】:

        函数/方法有时能够采用不同类型的参数来完成它的工作。这是函数重载的时候了。否则,您将不得不为相同的功能使用不同的功能,这是令人困惑和不好的做法。

        • 构造函数是函数,因此可以重载。这非常方便。
        • 当您第一次接触重载时,很容易过度幻想,认为您通过为未来的开发人员提供更方便的选项是在帮他们一个忙。尽量避免这种情况。不必要的重载可能迷惑未来的开发人员并导致维护不必要的代码。

        【讨论】:

          【解决方案6】:

          有时,根据可用的上下文和输入,您有多种方法可以完成同一件事。对于类型严格的静态语言,函数定义可能非常严格,需要提前明确定义。

          构造函数通常是最好的经典例子。如果您正在构建一个复杂的对象并且没有所有部分,您仍然希望能够将您拥有的内容传递给构造函数并让它填充其余部分。你所拥有的可能会有很大的不同,需要以不同的方式定义为构造函数的参数。

          【讨论】:

            【解决方案7】:

            ad-hoc polymorphism 是个好东西!!

            【讨论】:

              【解决方案8】:

              它针对对象的属性为同一对象提供多种行为。

              例如,名为addUs(a,b) 的方法添加了ab

              所以定义是:

              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;
              }
              

              【讨论】:

              • 那是什么编程语言?你的 , 和 = 键坏了吗? ;)
              【解决方案9】:

              您可能希望在具有不同参数的代码中执行类似的操作。如果你必须给每个函数一个不同的名字,代码的可读性会很差。

              【讨论】:

                【解决方案10】:

                这是同名函数在不同实例上执行不同任务的机制。我们很容易记住常用的名称。

                【讨论】:

                  猜你喜欢
                  • 2019-07-24
                  • 2020-02-07
                  • 2021-03-31
                  • 1970-01-01
                  • 2022-11-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多