2010-05-11 321 views
15

在方法重載中,重載方法可能有不同的返回類型嗎? 例如,重載方法可能有不同的返回類型嗎?

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

在一般面向對象的編程,這可能嗎?

+1

Dupe of http://stackoverflow.com/questions/584664/why-cant-two-methods-be-declared-with-the-same-signature-even-though-their-retur本身就是一個愚蠢的o f http://stackoverflow.com/questions/442026/function-overloading-by-return-type – paxdiablo 2010-05-11 03:32:01

回答

0

對於大多數支持方法重載的編程語言(Java,C#,C++,...),如果參數類型不同,那麼返回類型也可能不同。

1

只要你不要做這樣的事情:

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

你應該沒問題。上面的代碼會導致問題,因爲它可能試圖調用這兩個函數。它可以變得很糟糕,如果你正在使用C++,並返回指針,而不是原語或引用...

0

退房這個真棒答案,Function overloading by return type?

總之,大多數靜態類型語言不這樣做,但是一些動態類型的語言可以。

編輯:「簡而言之」的答案適用於按返回類型重載嚴格。正如其他人指出的那樣,如果參數列表不同,並且可以由編譯器解決,那麼每種方法可能會返回不同的類型。它只能通過ADA中的返回類型重載方法,因爲返回值不能被忽略,並且編譯器可以使用此信息來解析方法調用。

+0

無法解釋的downvote後編輯。 – 2010-05-11 12:41:20

19

在一個類中,可以有幾個方法共享相同的名稱,但在

  1. 參數類型
  2. 不同
  3. 參數的數量
  4. 秩序的方法聲明的參數的

通過依賴爲方法提供的參數,在運行時,編譯器確定要執行的方法的版本。

重載的方法可能有也可能沒有不同的返回類型。但是,返回類型本身不足以讓編譯器確定在運行時要執行哪種方法。

+3

「在運行時,編譯器確定」AFAIK在運行時,而程序運行時編譯器無法確定任何東西。而方法重載是**編譯時間多態**的一個例子。 – 2014-12-11 20:04:26

+0

@Dunith Dhanushka你爲什麼說參數順序? '無效樂趣(INT一個,所以char a){ \t \t \t \t \t} \t \t無效樂趣(CHAR一,詮釋一){ \t \t}'它不工作 – UnKnown 2015-06-05 11:08:59

+0

其實,參數順序在C未知++ ,所以-1。 – 2017-10-02 14:23:41

1

沒有方法重載是不可能在不同的返回類型的情況下,由於編譯器想不通,他需要調用哪個方法..

+0

這完全正確..! :) – 2015-08-28 11:30:18

0

是由你給出的例子很可能是我們可以做的方法ovrloading在這種方式在C#

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

你試過嗎?你怎麼稱呼這些功能,你能用上面的例子來解釋一下嗎? – 2015-08-28 11:29:52

12

它不可能有相同的參數和不同類型return的方法。 編譯器throws error在下面的情況下(重複方法)。

方法1

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

方法2:

public String calc(int e, int f, int g) 
0
Integer doSomething(){return null;} 
String doSomething(){return null;} 

main(){ 
    doSomething() 
} 

在這種情況下,編譯器將永遠不知道要調用哪種方法。

注 - 方法重載在編譯時

9

方法重載是指具有兩種以上的方法具有相同的名字在不同的參數相同的類進行檢查。方法重載的好處是它允許你實現支持相同語義操作的方法,但是參數號或類型不同。

要點

  • 重載方法必須改變參數列表
  • 重載方法可以改變返回類型
  • 重載方法可以改變訪問修飾符
  • 重載方法可以聲明新的或更廣泛的檢查例外
  • 一種方法可以在同一類或子類中重載
+0

「重載的方法可以改變返回類型」和「•重載的方法可以改變訪問修飾符」場景的工作嗎?根據我的實際經驗,它工作。 例如: public class myclass { public int c = 0; public string Add(int a,int b) { c = a + b; return c.ToString(); } public int Add(int a,int b) { c = a + b; return c; } } – 2015-08-28 11:26:41

+1

@SHEKHARSHETE但你的例子中的參數列表是不變的,必須改變其他人是可選的 – 2016-03-26 05:11:07

2

這對超載無效。您只能通過更改參數列表來重載。由於返回類型不是方法簽名的一部分(方法名稱和參數列表位於方法簽名中),因此單獨更改返回類型對於方法重載無效。

0

您可以使用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); 

對於更refrence https://eli.thegreenplace.net/2014/variadic-templates-in-c/

相關問題