web-dev-qa-db-fra.com

Surcharge de méthode avec un type de retour différent

Je veux creuser dans le fait que ce soit une ambiguïté ou une fonctionnalité supplémentaire fournie:

 public class Foo 
 { 
    public int Bar(){
       //code
    }

    public string Bar(int a){
       //code
    }
 }

Toute personne ayant une expérience avec cela, la surcharge sur le type de retour avec différents paramètres devrait être une mauvaise pratique, n'est-ce pas?

Mais si la surcharge a été effectuée sur la base du type de retour, alors pourquoi cela ne fonctionne pas.

 public class Foo 
 { 
    public int Bar(int a){
       //code
    }

    public string Bar(int a){
       //code
    }
 }

Comme il ne pourra pas décider quelle fonction appeler la première ou la seconde, si nous appelons obj.Bar (); , cela devrait se terminer par erreur. N'importe qui a une idée de la raison pour laquelle il permet au premier extrait de code de s'exécuter.

17
Adil Abbasi

La spécification C # (section 10.6) indique que les membres surchargés ne peuvent pas différer uniquement par le type de retour et selon http://msdn.Microsoft.com/en-us/library/ms229029.aspx

Selon votre question concernant la création de paramètres simplement pour prendre en charge différents types de retour? Je crois personnellement que c'est une terrible solution au problème. La maintenance du code deviendra difficile et les paramètres inutilisés sont une odeur certaine de code. La méthode doit-elle vraiment être surchargée dans ce cas? Ou appartient-il à cette classe? Faut-il créer autre chose pour convertir d'un type de retour en un autre? Tout ce que vous devriez demander pour obtenir une solution plus idiomatique.

30
Jesse C. Slicer

C'est logiquement impossible. Considérez l'appel suivant:

object o = Bar(42);

ou même

var o = Bar(42);

Comment le compilateur saurait-il quelle méthode appeler?

Edit: Maintenant que je comprends ce que vous demandez réellement, je pense que la surcharge par des paramètres sans signification est une mauvaise pratique et une lisibilité diminuée, il est de loin préférable de distinguer par le nom de la méthode:

 string BarToStr()
 {

 }

 int BarToInt()
 {

 }
17
Rotem

D'autres ont déjà expliqué la situation. Je voudrais seulement ajouter ceci: vous pouvez faire ce que vous avez en tête en utilisant un paramètre de type générique:

public T Bar<T>(int a) {
   // code
}

Et appelez-le comme ceci:

int i = Bar<int>(42);
string s = Bar<string>(42);

Le problème est qu'il est souvent difficile de faire quelque chose de significatif avec un type générique, par ex. vous ne pouvez pas lui appliquer d'opérations arithmétiques. Parfois contraintes de type génériques peut aider.

8

Vous ne pouvez pas surcharger la fonction en ne différant que leur type de retour. Vous ne pouvez surcharger la fonction que des manières suivantes

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

Vous ne pouvez pas savoir quelle fonction est réellement appelée (si c'était possible).

Une autre chose que j'aimerais ajouter est la surcharge de fonctions est fournir une fonction avec le même nom, mais avec une signature différente. mais le type de retour d'une méthode n'est pas considéré comme faisant partie de la signature de la méthode .

C'est donc une autre façon de comprendre pourquoi la surcharge de méthode ne peut pas être effectuée uniquement par type de retour.

4
Sachin

toute personne ayant une expérience avec cela, la surcharge sur le type de retour avec différents paramètres devrait être une mauvaise pratique, n'est-ce pas.

Je suppose que cela signifie - "est-ce une mauvaise pratique d'utiliser différentes combinaisons de paramètres pour faciliter différents types de retour" - si telle est bien la question, alors imaginez simplement quelqu'un d'autre rencontrant ce code dans quelques mois - effectivement "factice" "paramètres pour déterminer le type de retour ... il serait assez difficile de comprendre ce qui se passe.

Modifier - comme le souligne ChrisLava "le moyen de contourner cela est d'avoir de meilleurs noms pour chaque fonction (au lieu de surcharger). Des noms qui ont une signification claire dans l'application. Il n'y a aucune raison pour que Bar retourne un int et une chaîne. Je pourrais voir simplement appeler ToString () sur l'int "

2
NDJ

C # ne le permet pas .

C # d'autre part ne prend pas en charge la résolution de méthode basée sur le type de retour; c'était une décision consciente des concepteurs de langage de ne pas exposer la fonctionnalité du CLR qui le permet. Il n'y a aucune raison technique pour laquelle ils n'auraient pas pu le faire, ils ont juste senti qu'il valait mieux ne pas le faire. Étant donné que la valeur de retour n'est pas utilisée pour la sélection de méthode, une signature de méthode C # ne l'inclut pas.

1
Maarten

Vous ne pouvez pas créer de méthode avec le même nom, le même nombre et les mêmes types de paramètres.

Pour plus de détails, reportez-vous à cette lien .

0
Vishal Patel

Votre code entraînera une erreur de compilation. Vous ne pouvez pas avoir une méthode du même nom avec les mêmes paramètres et un type de retour différent, l'appelant ne saurait pas quelle méthode appeler (ne pourra pas résoudre l'emplacement en mémoire de la méthode à appeler, pourquoi le compilateur pas le permettre). Votre alternative serait de retourner un objet et de le lancer en fonction de ce que l'appelant sait. Même alors, cela semble être une mauvaise conception.

Cela fonctionnera (ce qui signifie Compiler), mais toujours une mauvaise conception.

public class Foo
{
    public object Bar(int a)
    {
        return a;
    }
}
0
CodeCowboyOrg

Vérifiez ceci. Vous ne pouvez pas avoir de méthode avec la même signature et un type de retour juste différent. Recommandé est mentionné dans cette question.

Type de retour de surcharge C # - approche recommandée

0
Adarsh Shah