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?
Dans une classe, il peut y avoir plusieurs méthodes partageant le même nom mais différant
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.
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
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
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).
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 ...
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
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.
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;
}
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.
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/