Implémenter une interface avec des méthodes génériques

Je dessine un blanc sur celui-ci et ne semble pas trouver un exemple précédent que j’ai écrit. J’essaie d’implémenter une interface générique avec une classe. Lorsque j’implémente l’interface, je pense que quelque chose ne fonctionne pas correctement car Visual Studio produit continuellement des erreurs indiquant que je n’implémente pas toutes les méthodes de l’interface générique.

Voici un bout de mon travail avec:

public interface IOurTemplate { IEnumerable List() where T : class; T Get(U id) where T : class where U : class; } 

Alors, à quoi devrait ressembler ma classe?

Vous devriez retravailler votre interface, comme ceci:

 public interface IOurTemplate where T : class where U : class { IEnumerable List(); T Get(U id); } 

Ensuite, vous pouvez l’implémenter en tant que classe générique:

 public class OurClass : IOurTemplate where T : class where U : class { IEnumerable List() { yield return default(T); // put implementation here } T Get(U id) { return default(T); // put implementation here } } 

Ou, vous pouvez le mettre en œuvre concrètement:

 public class OurClass : IOurTemplate { IEnumerable List() { yield return "Some Ssortingng"; // put implementation here } ssortingng Get(MyClass id) { return id.Name; // put implementation here } } 

Je pense que vous voulez probablement redéfinir votre interface comme ceci:

 public interface IOurTemplate where T : class where U : class { IEnumerable List(); T Get(U id); } 

Je pense que vous voulez que les méthodes utilisent (réutilisent) les parameters génériques de l’interface générique dans laquelle ils sont déclarés; et que vous ne voulez probablement pas en faire des méthodes génériques avec leurs propres parameters génériques (distincts de ceux de l’interface).

Compte tenu de l’interface telle que je l’ai redéfinie, vous pouvez définir une classe comme ceci:

 class Foo : IOurTemplate { public IEnumerable List() { ... etc... } public Bar Get(Baz id) { ... etc... } } 

Ou définissez une classe générique comme ceci:

 class Foo : IOurTemplate where T : class where U : class { public IEnumerable List() { ... etc... } public T Get(U id) { ... etc... } } 

— Modifier

Les autres réponses sont meilleures, mais notez que VS peut implémenter l’interface pour vous, si vous êtes confus quant à son apparence.

Processus décrit ci-dessous.

Eh bien, Visual Studio me dit que cela devrait ressembler à ceci:

 class X : IOurTemplate { #region IOurTemplate Members IEnumerable IOurTemplate.List() { throw new NotImplementedException(); } T IOurTemplate.Get(U id) { throw new NotImplementedException(); } #endregion } 

Notez que tout ce que j’ai fait était l’interface d’écriture, puis cliquez dessus, et attendez que la petite icône apparaisse pour que VS génère l’implémentation pour moi 🙂