C'est le genre de chose que je veux faire: de sorte que les classes implémentées ceci doivent avoir une fonction qui renvoie une liste de leur propre type.
Est-ce seulement possible?
Je sais que - techniquement - une classe mettant en œuvre cela pourrait renvoyer une liste d'autres classes qui implémentent cela, pas nécessairement la même classe, mais je peux vivre avec cela même si ce n'est pas idéal. P> J'ai essayé cela, mais je ne peux pas obtenir la classe de mise en œuvre correctement implémenter la méthode. p> p>
4 Réponses :
Mise en œuvre de cette interface est simple:
public interface IMyInterface<T> where T : IMyInterface<T>
{
List<T> GetAll(string whatever)
}
public class MyInterfaceImpl : IMyInterface<MyInterfaceImpl>
{
public List<MyInterfaceImpl> GetAll(string whatever)
{
return new List<MyInterfaceImpl > { new MyInterfaceImpl(), this };
}
}
Nice Etui d'utilisation pour le Modèle de modèle curieusement récurrent ;)
Aimer l'ajout des génériques.
Faire de l'interface Auto-référencement a des implications de conception sérieuses que je serais méfiante. Vous ne pouvez plus simplement déclarer une variable de type "imyinterface". Vous devez spécifier un type d'interface qui défait généralement le but d'une interface.
@Elidavis: Avec cette argumentation, vous avez ignoré tous les cas d'utilisation de génériques dans des interfaces ...
Désolé, d'être plus précis, avec le code ci-dessus, vous ne pouvez pas transmettre autre chose qu'une implémentation de l'interface. IE: Vous ne pouvez pas faire imyinterface iSomething
@Elidavis: C'est précisément ce que nous voulons atteindre ici: Renvoyer la classe, pas l'interface
Je suppose que je suis confus sur ce que vous entendez en voulant atteindre "la classe de retour, pas l'interface". D'après ce que j'ai interprété ce qu'il voulait, c'était un "dynamique" (pas sûr le meilleur mot ici) la signature de la méthode d'interface ajustée en fonction de la classe d'implémentation. Pas une restriction dans la déclaration d'un type de variable, car vous ne pouvez plus simplement déclarer une variable de type "imyinterface". Il a des implications de conception que les gens devraient se méfier si elles veulent utiliser cette interface auto-référenceuse, car elle affecte la manière dont les autres peuvent l'utiliser, ce que je discuterais est substantiel. C'est tout.
Ceci est une solution normale. Considérez que vous avez une interface iPerson code> et vous souhaitez accéder à chaque parent d'une personne. Il serait donc raisonnable d'avoir une déclaration d'interface comme suit: class Person : IPerson
{
IList<IPerson> parents;
public Person(IList<IPerson> parents)
{
this.parents = parents;
}
public IList<IPerson> GetAllParents()
{
return parents;
}
}
Je ne vois pas pourquoi l'interface ne pouvait pas se réfuser lui-même - aucun problème ci-dessous.
Cela fonctionne pour moi:
public interface IMyInterface
{
List<IMyInterface> GetAll(string whatever);
}
public class Program : IMyInterface
{
public string Member { get; set; }
public List<IMyInterface> GetAll(string whatever)
{
return new List<IMyInterface>()
{ new Program() { Member = whatever } };
}
static void Main(string[] args)
{
List<IMyInterface> all = new Program().GetAll("whatever");
Console.WriteLine(all.Count);
}
}
Peut-être que coupler cela avec un générique / modèle vous permettrait d'atteindre votre objectif.
S'il vous plaît ne postez pas deux questions relativement non liées en une. La sérialisation n'a vraiment rien à voir avec la définition de l'interface.
Vous devriez utiliser IList plutôt que de la liste
J'ai essayé cela, i> - alors veuillez inclure ce code avec le message d'erreur.
> Est-ce que cela est encore possible? Oui c'est le cas. Ne vois aucun pb avec ça. > La classe Mise en œuvre Cela pourrait renvoyer une liste d'autres classes qui implémentent ceci ... Bien que ce n'était pas idéal oui, c'est l'une des idées principales du concept d'interface. Si vous avez besoin d'une classe et une seule classe à renvoyer, vous n'avez probablement pas besoin d'une interface. Ou vous pouvez avoir une implémentation d'interface uniquement. > Impossible d'obtenir la classe d'implémentation correctement implémenter l'exemple de code de méthode serait nécessaire pour comprendre ce qui ne va pas.