【问题标题】:Is it possible to have different return types for a overloaded method?重载方法是否可以有不同的返回类型?
【发布时间】:2010-05-11 03:09:52
【问题描述】:

在方法重载中,重载的方法可以有不同的返回类型吗? 例如,

void foo(int x) ;
int foo(int x,int y);
double foo(String str);

一般的面向对象编程,有可能吗?

【问题讨论】:

标签: overloading


【解决方案1】:

在一个类中,可以有多个方法同名但不同

  1. 参数类型
  2. 参数数量
  3. 方法中声明的参数顺序

通过根据为方法提供的参数,在运行时,编译器决定执行哪个版本的方法。

重载的方法可能有也可能没有不同的返回类型。但是仅返回类型不足以让编译器确定在运行时要执行哪个方法。

【讨论】:

  • "在运行时,编译器确定"AFAIK 在运行时,当程序运行时,编译器无法确定任何东西。和方法重载是编译时多态性的一个例子。
  • @Dunith Dhanushka 你为什么说参数顺序? void fun(int a, char a){ } void fun(char a, int a){ } 不工作
  • 其实C++中参数的顺序是未知的,所以-1。
  • 这里要补充一点:这在 Rust 中是可能的!当我第一次看到它在那里使用时让我大吃一惊
【解决方案2】:

方法重载意味着在同一个类中有两个或多个同名的方法,但参数不同。方法重载的好处是它允许您实现支持相同语义操作但参数数量或类型不同的方法。

要点

  • 重载的方法必须更改参数列表
  • 重载的方法可以改变返回类型
  • 重载的方法可以更改访问修饰符
  • 重载的方法可以声明新的或更广泛的检查异常
  • 方法可以在同一个类或子类中重载

【讨论】:

  • “重载的方法可以改变返回类型”和“• 重载的方法可以改变访问修饰符”场景是否有效?根据我的实际经验,它不会起作用。例如: public class myclass { public int c = 0;公共字符串 Add(int a, int b) { c=a + b;返回 c.ToString(); } public int Add(int a, int b) { c = a + b;返回 c; } }
  • @SHEKHARSHETE 但是您的示例中的参数列表没有变化,必须更改其他可选
【解决方案3】:

不可能有具有相同参数和不同return 类型的方法。 以下情况下的编译器throws error(复制方法)。

方法一:

public int calc(int a, int b, int c)

方法二:

public String calc(int e, int f, int g)

抛出错误:

method calc(int, int, int) is already defined

【讨论】:

  • 也可以重载泛型方法的返回类型。例如,这可以通过in C# 完成。
【解决方案4】:

在返回类型不同的情况下,不可能没有方法重载,因为编译器无法确定他需要调用哪个方法..

【讨论】:

    【解决方案5】:
    Integer doSomething(){return null;}
    String doSomething(){return null;}
    
    main(){
        doSomething()
    }
    

    在这种情况下,编译器永远不会知道要调用哪个方法。

    注意 - 在编译期间检查方法重载

    【讨论】:

      【解决方案6】:

      只要你不做这样的事情:

      int foo (int i, int has_default=0);
      double foo (long l);
      /* Skipping to the function call.  */
      foo (1);
      

      你应该没事的。上面的代码会导致问题,因为它可能试图调用任何一个函数。如果你使用 C++ 会变得非常糟糕,并且你返回的是指针而不是原语或引用......

      【讨论】:

        【解决方案7】:

        这对于重载无效。您只能通过更改参数列表来重载。单独更改返回类型对方法重载无效,因为返回类型不是方法签名的一部分(只有方法名称和参数列表在方法签名中)。

        【讨论】:

          【解决方案8】:

          看看这个很棒的答案,Function overloading by return type?

          简而言之,大多数静态类型语言不会,但一些动态类型语言可以。

          编辑:“简而言之”的答案适用于按返回类型严格重载。正如其他人指出的那样,如果参数列表不同,并且可以由编译器解析,那么每个方法都可能返回不同的类型。 可以在 ADA 中仅通过返回类型重载方法,因为返回值不能被忽略,编译器可以使用此信息解析方法调用。

          【讨论】:

            【解决方案9】:

            是的,您给出的示例是可能的,我们可以在 c# 中以这种方式进行方法重载

            void foo(int x)
                {
                }
                int foo(int x, int y)
                {
                    return 0;
                }
                double foo(String str)
                {
                    return 1;
                }
            

            【讨论】:

            • 你试过这个吗?你将如何调用这些函数,你能用上面的例子解释一下吗?
            【解决方案10】:

            您可以使用 C++ 的 Varadic 模板功能 举个例子:

            template<typename T>
            T adder(T v) {
              return v;
            }
            
            template<typename T, typename... Args>
            T adder(T first, Args... args) {
              return first + adder(args...);
            }
            

            我们可以这样称呼它:

            long sum = adder(1, 2, 3, 8, 7);
            
            std::string s1 = "x", s2 = "aa", s3 = "bb", s4 = "yy";
            std::string ssum = adder(s1, s2, s3, s4);
            

            更多参考https://eli.thegreenplace.net/2014/variadic-templates-in-c/

            【讨论】:

              【解决方案11】:

              简而言之,重载返回类型需要一个强大的类型系统,它可以从调用结果中派生出要使用的函数。

              Haskell 和 ML 家族可以完成这项工作。

              定义重载以限制更改参数是不正确的,因为更改返回类型会为编译器留下足够的信息来派生要使用的函数。

              【讨论】:

                【解决方案12】:

                对于大多数支持方法重载的编程语言(Java、C#、C++、...),如果参数类型不同,那么返回类型也可以不同。

                【讨论】:

                  猜你喜欢
                  • 2013-10-26
                  • 2014-01-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-15
                  • 2013-12-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多