2010-02-10 30 views
2

Je sens cette question est une boîte de vers, mais je vais demander quand même ... :)Comment gérer les conflits dans les signatures de méthodes surchargées?

J'ai une méthode:

private MembershipUser GetUserFromReader(SqlDataReader reader) 

Et je veux surcharger cette méthode avec un autre Type de retour:

private User GetUserFromReader(SqlDataReader reader) 

Mais le compilateur se plaint que les deux méthodes ont la même signature.

Alors, quelle est la meilleure façon de faire cela? Je préférerais ne pas ajouter un paramètre inutile juste pour changer la signature de la méthode.

J'ai joué avec l'idée de faire quelque chose comme:

private User GetUserFromReader(T reader) 

Mais ne l'ai pas vraiment exploré cette en pleine encore. Il semble que je devrais faire un tas de changements avec la façon dont j'utilise mon objet lecteur.

Des idées? Quelle est la meilleure pratique lorsque vous avez deux méthodes surchargées de la même signature?

Merci de nous aider à ...

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement renommer la méthode privée? Ce n'est pas comme si cela affectait les utilisateurs externes de votre classe - c'est privé, après tout. –

+0

oui, d'accord. cela a eu ma réponse :) –

Répondre

6

Pourquoi surcharger?Pourquoi ne pas simplement laisser la méthode dire ce qu'il fait, comme ceci:

private MembershipUser GetMembershipUserFromReader(SqlDataReader reader) 
private User GetUserFromReader(SqlDataReader reader) 
+0

Merci. Je n'ai pas vraiment pensé à l'accessibilité quand je posais la question. Je pense que c'est la meilleure solution dans ce cas parce que c'est «privé». –

1

Vous ne pouvez pas modifier le type de retour sur une surcharge. Comment le compilateur est censé dire lequel vous voulez utiliser?

Ce que vous devez faire est de retourner une super-classe commune de tout ce que vous pourriez vouloir retourner, puis de retourner tout ce qui est applicable.

Soit cela, ou nommer les méthodes différemment, car ils font clairement des choses différentes.

2

Vos seules options sont réelles:

  1. changer le nom de la fonction
  2. Modifier la signature de la fonction

Je déteste être un lieu commun, mais il n'est pas un moyen de contourner la restriction sur les méthodes de différenciation uniquement par type de retour.

Si l'une des surcharges est déclarée dans une classe parente, vous pouvez utiliser le mot clé new pour masquer la méthode supérieure des appelants, mais new (sur une déclaration de membre) est généralement considéré comme incorrect.

1

La réponse simple est que, en ce qui concerne C#, vous ne pouvez pas. La surcharge par type de retour est autorisée (I pense) par MSIL, mais pas par C#.

Le seul vrai choix (i.e., à l'exception d'ajouter un paramètre « factice »), est d'appeler une méthode GetMembershipUserFromReader et l'autre GetUserFromReader

+0

Correct; le CLR permet aux surcharges de ne différer que par le type de retour. Il existe un certain nombre de différences subtiles entre les règles C# pour la correspondance des signatures et les règles CLR; C'est le plus évident. –

+0

@Eric: Savez-vous pourquoi cela est implémenté dans le CLR? J'ai pensé que cela pourrait être utile dans certains cas en C#, mais mes collègues n'étaient pas d'accord avec moi. Mais pour moi, surcharger le type de retour là où ce n'est pas ambigu est logique. Que penses-tu Eric? –

+1

@Joan: Dans le langage MSIL, il n'existe pas de "résolution de surcharge". Chaque méthode (ou slot de méthode virtuelle) a un "token" unique, et un appel de méthode s'apparente à peu près à "appeler la méthode associée à ce jeton". Comme il n'y a pas besoin de faire une résolution de surcharge basée sur des arguments, le type de retour peut faire partie de la signature. –

5

Si vous voulez vraiment différencier le type de retour, mais utiliser la même signature de méthode, vous pouvez utiliser les médicaments génériques:

private T GetUserFromReader<T>(SqlDataReader reader) 

Mais il est beaucoup plus simple de renommer les méthodes, comme dans la réponse de Luhmann.

+0

Merci un paquet. Je vais essayer quand je rencontre la même situation avec des méthodes publiques. Dans ce cas, parce que c'est privé, je suis d'accord que la réponse de Luhmann est la meilleure solution. –