2010-05-11 25 views
15

Czy w metodzie przeciążania możliwe są różne typy zwracania dla przeciążonej metody? npCzy jest możliwe stosowanie różnych typów zwracania dla przeciążonej metody?

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

w ogólnym programowania obiektowego, jest to możliwe?

+1

Dupek z http://stackoverflow.com/questions/584664/why-cant-two-methods-be-declared-z-same-same-signature-even-though-thei--urur, który sam w sobie jest dupe f http://stackoverflow.com/questions/442026/function-overloading-by-return-type – paxdiablo

Odpowiedz

0

Dla większości języków programowania, które obsługują przeciążanie metod (Java, C#, C++, ...), jeśli typy parametrów są różne, to typy zwracanych mogą być również różne.

1

Dopóki tego nie zrobisz coś takiego:

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

powinno być w porządku. Powyższy kod spowoduje problemy, ponieważ może próbować wywołać tę funkcję. To może się naprawdę źle, jeśli używasz C++, a wrócisz wskazówek zamiast prymitywów lub referencji ...

0

Sprawdź to niesamowite odpowiedź, Function overloading by return type?

W skrócie, najbardziej statycznie wpisywanych języków nie, ale niektóre dynamicznie napisane języki mogą.

Edycja: odpowiedź "W skrócie" dotyczy przeciążenia ściśle według typu zwrotu. Jak zauważyli inni, jeśli listy parametrów różnią się i mogą być rozwiązane przez kompilator, każda metoda może zwrócić inny typ. Możliwe jest przeciążanie metod tylko przez typ zwracany w ADA, ponieważ nie można zignorować zwracanej wartości, a kompilator może rozwiązać wywołanie metody za pomocą tych informacji.

+0

Edytowane po niewyjaśnionym downvote. –

19

w klasie nie może być kilka metod dzielą tę samą nazwę ale różnią się

  1. typów parametrów
  2. Liczba parametrów
  3. Zamówienie parametrów deklarowanych w metodzie

W zależności od parametrów podanych dla metody, w czasie wykonywania kompilator określa, która wersja metody ma zostać wykonana.

Metoda przeciążona może mieć lub nie mieć różne typy zwracanych danych. Jednak sam typ powrotu nie jest wystarczający, aby kompilator mógł określić, która metoda ma zostać wykonana w czasie wykonywania.

+3

"w czasie wykonywania kompilator określa" AFAIK w środowisku wykonawczym, podczas gdy program jest uruchomiony, kompilator nie może niczego ustalić. Przeciążanie metod jest przykładem ** polimorfizmu czasu kompilacji **. –

+0

@Dunith Dhanushka dlaczego mówisz Order of Parameters? 'Void fun (int a, char a) { \t \t \t \t \t} \t \t void fun (char a, int a) { \t \t}' nie działa – UnKnown

+0

Właściwie kolejność parametrów jest nieznana w C++ , więc -1. –

1

Żadna metoda przeciążenie nie jest możliwe w przypadku innego typu powrotnej, ponieważ kompilator nie może zrozumieć, co metoda musiał zadzwonić ..

+0

to doskonale prawo ..! :) –

0

Tak Przykład podany przez ciebie jest możliwe, co możemy zrobić w metodę ovrloading w ten sposób w C#

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

próbowałeś tego? jak nazwać te funkcje można wyjaśnić na przykład powyżej? –

12

to nie jest możliwe, aby mieć metodę z tymi samymi parametrami i innym return typu. Kompilator throws error w poniższym przykładzie (metoda Duplikuj).

Metoda 1:

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

Metoda 2:

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

main(){ 
    doSomething() 
} 

W tym przypadku kompilator nigdy nie będą wiedzieć, które metody są wywoływane.

Uwaga - Metoda Przeciążenie jest sprawdzana podczas kompilacji

9

Metoda Przeciążenie znaczy mieć dwie lub więcej metod o tej samej nazwie w tej samej klasie z różnymi argumentami. Zaletą przeciążania metod jest to, że umożliwia implementację metod obsługujących tę samą operację semantyczną, ale różniących się liczbą lub typem argumentu.

Ważne punkty

  • Przeciążone metody musi zmienić listę argumentów
  • Przeciążone metody można zmienić typ zwracany
  • Przeciążone metody można zmienić modyfikatora dostępu
  • Przeciążone metody mogą deklarować nowe lub szersze sprawdzone wyjątki
  • Metoda może być przeciążona w tej samej klasie lub w podklasie
+0

Czy "Przeciążone metody MOGĄ zmienić typ zwracania" i "• Przeciążone metody MOGĄ zmienić scenariusz modyfikatora dostępu" działają? Zgodnie z moim praktycznym doświadczeniem NIE DZIAŁA. Np .: publiczna klasa myclass { public int c = 0; public string Dodaj (int, int b) { c = a + b; return c.ToString(); } public int Dodaj (int, int b) { c = a + b; return c; } } –

+1

@SHEKHARSHETE Ale lista argumentów pozostaje niezmieniona w twoim przykładzie, musi być zmieniona inne są opcjonalne –

2

Nie można tego dokonać w przypadku przeciążenia. Możesz tylko przeciążać, zmieniając listę parametrów. Zmiana samego typu zwracanego nie jest poprawna w przypadku przeciążania metod, ponieważ typ zwracany nie jest częścią sygnatury metody (tylko nazwa metody i lista parametrów znajdują się w sygnaturze metody).

0

można użyć funkcji szablonu Varadic C++ Hear jest przykład:

template<typename T> 
T adder(T v) { 
    return v; 
} 

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

A oto kilka sposobów możemy to nazwać:

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

dla bardziej refrence https://eli.thegreenplace.net/2014/variadic-templates-in-c/

Powiązane problemy