8
votes

Comment Iset a-t-il deux méthodes d'ajout (T item) qui varient uniquement par type de retour?

Je sais que je ne peux pas surcharger un type de retour (je pense que je le sais).

void F()
{
}

bool F()
{
   return true;
}


1 commentaires

Merci pour les réponses, je choisirai au hasard un pour marquer comme la réponse


3 Réponses :


4
votes

L'autre ajouter code> est un Méthode d'interface explicitement implémentée .

Lorsqu'une méthode d'interface est mise en œuvre explicitement, elle ne peut pas être appelée sans faire de la référence au type d'interface en premier, ce qui fait des appels sans ambiguïté, et donc avoir plusieurs méthodes avec La même signature est bonne. p>

Pour ce faire dans votre code, vous le feriez, par exemple P>

class MyCollection<T> : ICollection<T> {
    public void Add() { ... }
    void ICollection<T>.Add() { ... }
}


2 commentaires

En disant que l'autre méthode d'ajout est une méthode d'interface explicite est fausse. Explicitement Mise en œuvre de la méthode d'interface ne peut apparaître que dans une classe / la structure et le ne peut jamais apparaître sur une interface, car les interfaces ne peuvent pas avoir Mise en œuvre en dehors d'une classe / structure. Les deux méthodes que vous mentionnez sont des méthodes d'interface, une sur Iset et l'autre sont sur l'ICollection, et aucun d'entre eux n'est explicitement mis en œuvre la méthode d'interface lorsque nous ne mentionnons pas les classes qui implémentent ces interfaces, que vous n'avez pas. Peut-être que vous pourriez utiliser un meilleur libellé.


@zespri: Vous avez raison. Je n'ai pas regardé la page correctement et je n'ai pas remarqué que c'était une interface et non une classe. Vous devriez publier votre commentaire comme une réponse, car il y a évidemment une différence entre les interfaces et les classes ici.



4
votes

La première méthode "Ajouter" est en fait Icollection .add , qui est héritée.

Lorsque cela est implémenté dans une classe, au moins l'un des deux ajoutez Les méthodes devront être explicitement implémentées, c'est-à-dire: xxx


2 commentaires

Juste curieux, vous dites "implémenté dans une classe" - est-ce opposé à la mise en œuvre dans une structure?


@Gabriel non - implémenté dans aucun type. Cela étant dit, une structure implémentant iset serait très inapproprié. ;) Cela ne correspond à aucune des exigences suggérées pour une structure, car elle serait> 16 octets, mutable, etc.



3
votes

Les méthodes d'interface peuvent être mises en œuvre explicitement, comme: xxx

maintenant la méthode renvoyée void n'est accessible que si vous lancez la classe à l'interface: xxx


0 commentaires