为什么仅通过更改返回类型来重载函数是不可能的?这将在未来的Java版本中发生变化吗?
那么,仅供参考,这在C++中是否可行?
两个Java方法可以使用不同的返回类型具有相同的名称吗?方法的返回类型不同,它们使用相同的方法名称声明.
这是允许的吗?
对于阶乘子程序或程序,我希望看到所有不同的方法.希望是任何人都可以来这里看看他们是否想学习一门新语言.
基本上我想看一个例子,编写算法的不同方式,以及它们在不同语言中的样子.
请将其限制为每个条目一个示例.如果你试图突出一个特定的风格,语言,或者仅仅是一个经过深思熟虑的想法,我会允许你在每个答案中有不止一个例子.
唯一真正的要求是它必须在所有代表的语言中找到给定参数的阶乘.
# Language Name: Optional Style type
- Optional bullet points
Code Goes Here
Other informational text goes here
我会偶尔编辑任何没有正确格式的答案.
在C++中,函数的签名部分取决于它是否为const.这意味着一个类可以有两个具有相同签名的成员函数,除了一个是const而另一个不是.如果你有这样的类,那么编译器将根据你调用它的对象来决定调用哪个函数:如果它是类的const实例,那么将调用函数的const版本; 如果对象不是const,则将调用另一个版本.
您希望在什么情况下利用此功能?
我知道这是不可能的,但任何人都可以提供一个理论,为什么Java选择不支持这个?我问,因为我遇到了一个我觉得很高兴的情况.
我们都知道你可以根据参数重载一个函数:
int mul(int i, int j) { return i*j; }
std::string mul(char c, int n) { return std::string(n, c); }
Run Code Online (Sandbox Code Playgroud)
你能根据返回值重载一个函数吗?根据返回值的使用方式定义一个返回不同内容的函数:
int n = mul(6, 3); // n = 18
std::string s = mul(6, 3); // s = "666"
// Note that both invocations take the exact same parameters (same types)
Run Code Online (Sandbox Code Playgroud)
您可以假设第一个参数介于0-9之间,无需验证输入或进行任何错误处理.
在方法重载中,是否可以为重载方法设置不同的返回类型?例如,
void foo(int x) ;
int foo(int x,int y);
double foo(String str);
Run Code Online (Sandbox Code Playgroud)
在一般的面向对象编程中,有可能吗?
在C#中,我需要能够定义一个方法,但让它返回一个或两个返回类型.我尝试这样做时编译器给出了一个错误,但为什么不知道我需要调用哪种方法呢?
int x = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)
为什么编译器会阻止我使用具有不同返回类型的两个函数?
基于我读过的关于Haskell的内容,以及我用GHC做过的实验,似乎Haskell有返回类型重载(又称ad hoc多态).这方面的一个例子是fromInteger可以给你一个Double或一个Integer取决于结果使用位置的函数.例如:
fd :: Double -> String
fd x = "Double"
fi :: Integer -> String
fi x = "Integer"
fd (fromInteger 5) -- returns "Double"
fi (fromInteger 5) -- returns "Integer"
Run Code Online (Sandbox Code Playgroud)
Haskell的一个温和的介绍似乎同意这一点,当它说:
到目前为止我们讨论过的那种多态性通常被称为参数多态.另一种称为ad hoc多态,更好地称为重载.以下是ad hoc多态的一些示例:
- 文字1,2等通常用于表示固定和任意精度整数.
如果数字文字被认为是ad hoc多态(也就是重载)的一个例子,那么似乎对于函数的结果也是如此fromInteger.
事实上,我已经找到了一些关于Stack Overflow的其他问题的答案,这些问题表明Haskell通过返回类型进行了重载.
但是,至少有一个Haskell程序员告诉我这不是返回类型重载,而是"参数多态,其中参数受通用量词约束"的示例.
我认为他所得到的是fromInteger从每个实例Num(某种非确定性类型)返回一个值.
这似乎是一个合理的解释,但据我所知,Haskell从不让我们看到这些实例值中的多个(部分归功于Monomorphism限制).我们看来的实际情况似乎也可以静态确定.由于所有这一切,似乎有理由说在表达式fd (fromInteger 5)中子表达式fromInteger 5是类型Double,而在表达式fi (fromInteger 5)中子表达式fromInteger 5 …
我想深入了解它是否是一个含糊不清或提供的额外功能:
public class Foo
{
public int Bar(){
//code
}
public string Bar(int a){
//code
}
}
Run Code Online (Sandbox Code Playgroud)
任何有这方面经验的人,在具有不同参数的返回类型上重载应该是一种不好的做法,是吗?
但是如果重载是在返回类型的基础上完成的,那么为什么这不起作用.
public class Foo
{
public int Bar(int a){
//code
}
public string Bar(int a){
//code
}
}
Run Code Online (Sandbox Code Playgroud)
因为它将无法决定调用第一个或第二个函数,如果我们调用obj.Bar(); ,它应该以错误结束任何人都知道为什么它允许第一个代码片段运行.
overloading ×6
java ×3
c# ×2
c++ ×2
function ×2
.net ×1
algorithm ×1
coding-style ×1
const ×1
haskell ×1
methods ×1
oop ×1
polymorphism ×1
puzzle ×1
return ×1
return-type ×1