web-dev-qa-db-fra.com

Est-il possible d'avoir différents types de retour pour une méthode surchargée?

En surcharge de méthode, est-il possible d’avoir différents types de résultats pour une méthode surchargée?

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

en programmation orientée objet générale, est-ce possible?

22
Dunith Dhanushka

Dans une classe, il peut y avoir plusieurs méthodes partageant le même nom mais différant

  1. Types de paramètres
  2. Nombre de paramètres
  3. Ordre des paramètres déclarés dans la méthode

En fonction des paramètres fournis pour la méthode, au moment de l'exécution, le compilateur détermine la version de la méthode à exécuter.

Une méthode surchargée peut avoir ou non des types de retour différents. Mais le type de retour seul n'est pas suffisant pour que le compilateur détermine quelle méthode doit être exécutée au moment de l'exécution.

29
Dunith Dhanushka

Il n'est pas possible d'avoir une méthode avec les mêmes paramètres et différents return type . Compilateur throws error dans le cas ci-dessous (méthode Duplicate).

Méthode 1:

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

Méthode 2:  

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

Erreur renvoyée:

method calc(int, int, int) is already defined
16
Amarnath Rayudu

Surcharger une méthode signifie avoir deux méthodes ou plus portant le même nom dans la même classe avec des arguments différents. L'avantage de la surcharge de méthodes est qu'elle vous permet d'implémenter des méthodes qui supportent la même opération sémantique mais diffèrent par le nombre d'arguments ou le type.

Les points importants 

  • Les méthodes surchargées DOIVENT changer la liste des arguments
  • Les méthodes surchargées PEUVENT changer le type de retour
  • Les méthodes surchargées PEUVENT changer le modificateur d'accès
  • Méthodes surchargées PEUVENT déclarer des exceptions vérifiées nouvelles ou plus larges
  • Une méthode peut être surchargée dans la même classe ou dans une sous-classe
14
Sanshayan

Ceci n'est pas valable pour la surcharge. Vous ne pouvez surcharger qu'en modifiant la liste des paramètres. Changer le type de retour seul n'est pas valide pour la surcharge de méthode car le type de retour ne fait pas partie de la signature de la méthode (seuls le nom de la méthode et la liste des paramètres sont dans la signature de la méthode).

2
Mohamed Ali

Tant que vous ne faites pas quelque chose comme ça:

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

ça devrait aller. Le code ci-dessus posera des problèmes car il pourrait essayer d’appeler l’une ou l’autre fonction. Cela peut devenir très grave si vous utilisez C++ et que vous renvoyez des pointeurs à la place de primitives ou de références ...

1
Dustin
Integer doSomething(){return null;}
String doSomething(){return null;}

main(){
    doSomething()
}

Dans ce cas, le compilateur ne saura jamais quelle méthode doit être appelée.

Remarque - La surcharge de la méthode est vérifiée pendant la compilation

1
bharanitharan

Aucune surcharge de méthode n'est possible en cas de type de retour différent, car le compilateur ne peut pas déterminer quelle méthode il doit appeler.

1
Naveen Kant Mishra

oui l'exemple donné par vous est possible, nous pouvons faire la méthode surchargée de cette façon en c #

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

Pour la plupart des langages de programmation prenant en charge la surcharge de méthodes (Java, C #, C++, ...), si les types de paramètre sont différents, les types de retour peuvent également l'être.

0
Brett Kail

Vous pouvez utiliser la fonctionnalité de modèle Varadic de C++ Hear est l'exemple suivant:

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

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

Et voici comment nous pourrions l'appeler:

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

Pour plus de références https://eli.thegreenplace.net/2014/variadic-templates-in-c/

0
Hardik