Héritez d’une classe de base générique, appliquez une contrainte et implémentez une interface en C #

Ceci est une question de syntaxe. J’ai une classe générique qui hérite d’une classe de base générique et applique une contrainte à l’un des parameters de type. Je souhaite également que la classe dérivée implémente une interface. Pour la vie de moi, je n’arrive pas à comprendre la syntaxe correcte.

C’est ce que j’ai:

DerivedFoo : ParentFoo where T2 : IBar { ... } 

La première chose qui me vint à l’esprit était la suivante:

 DerivedFoo : ParentFoo where T2 : IBar, IFoo { ... } 

Mais cela est incorrect car cela oblige T2 à implémenter à la fois IBar et IFoo, pas DerivedFoo pour implémenter IFoo.

J’ai essayé un peu de googler, d’utiliser des deux-points, des points-virgules, etc., mais j’ai été court. Je suis sûr que la réponse est très simple.

Vous incluez la signature entière de votre classe avant de définir des contraintes génériques.

 class DerivedFoo : ParentFoo, IFoo where T2 : IBar { ... } 

Ma recommandation: lorsque vous avez une question sur la syntaxe du langage C #, lisez la spécification; c’est pourquoi nous le publions. Vous voudrez lire la section 10.1.

Pour répondre à votre question spécifique, l’ordre des choses dans une déclaration de classe est le suivant:

  • atsortingbuts, entre crochets
  • modificateurs (“public”, “static”, etc.)
  • “partiel”
  • “classe”
  • le nom de la classe
  • une liste séparée par des virgules de déclarations de parameters de type entre crochets
  • un deux-points a suivi une liste de types de base séparés par des virgules (classe de base et interfaces implémentées, la classe de base doit passer en premier s’il y en a une)
  • contraintes de paramètre de type
  • le corps de la classe, entouré d’accolades
  • un point-virgule

Tout ce qui figure sur cette liste est facultatif, sauf pour “class”, le nom et le corps, mais tout doit apparaître dans cet ordre s’il apparaît.

 public interface IFoo {} public interface IBar {} public class ParentFoo { } public class DerivedFoo : ParentFoo, IFoo where T1 : IBar { } 
 public class KeyAndValue { public ssortingng Key { get; set; } public virtual T Value { get; set; } } public class KeyAndValue : KeyAndValue { public override ssortingng Value { get; set; } } 

Ceci est une extension des réponses existantes. La valeur par défaut est ssortingng si vous ne fournissez pas de type. Je n’ai pas implémenté d’interface mais cela ne devrait pas nécessiter quelque chose de différent que d’habitude.