Je voudrais mettre en œuvre une classe C # générique qui ressemble à ce qui suit: ceci échoue car c # autorisera uniquement des types après l'interface de la classe de base, alors j'essaye donc : p> mais je trouve que c # ne permet pas cette forme de contrainte de type. Seul Comment puis-je dicter qu'un paramètre de type ne doit être qu'un type d'interface? < / p> p> où T: struct code> et
où T: Classe code> sont autorisés. P>
5 Réponses :
Fondamentalement, vous ne pouvez pas. P>
Vous pouvez faire une continuité d'une interface spécifique, mais pas un général pour toutes les interfaces. Vous pouvez donc contraindre à iEnumérable par exemple, mais pas aucune interface em>. P>
De quoi avez-vous besoin de cela pour de toute façon? P>
J'ai remarqué que toutes les classes découlant de Foobar implémente bla code> de mes classes dérivées sur la classe de base Foobar.
Vous ne pouvez pas en mots simples. P>
Ceci échoue car c # autorisera uniquement des types après l'interface de la classe de base p> blockQuote>
Cette contrainte est due à l'absence de multiples héritage dans C #. Le héritage multiple peut être approché par l'utilisation d'interfaces car les méthodes de remplacement sont explicites. De la même manière qu'une classe ne peut que prolonger une autre classe, mais peut implémenter plusieurs interfaces. L'astuce ici est que la classe d'implémentation doit définir le corps d'une méthode, de sorte que la mise en œuvre soit spécifique sur laquelle la méthode est appelée. P>
Utilisation d'un endroit où Limit T peut être appliqué à une classe ou plusieurs interfaces. Vous ne pouvez pas limiter la plage à plusieurs classes. P>
Je crois que vous avez mal compris la signification de Un générique type contrainte comme si cela signifie que Toutefois, le but d'une interface est de définir un contrat em> strud>, qui est un concept totalement différent, par rapport à la Semantitique de type de référence par rapport à la sémantique de référence de référence. P >
Par conséquent, une restriction comme Si vous voulez en savoir plus, je vous suggère de lire le Guide de programmation C # sur les contraintes de type: P>
où T: struct code> et
où T: classe code>. p>
t code> doit être un type
où T: interface code> n'a aucun sens. P>
Une contrainte de type d'interface aurait un sens s'il existait des caractéristiques linguistiques qui seraient utilisables sur ces types et seuls de tels types. Par exemple, il serait très utile que l'on puisse définir un wrapper
foo Code> de type
t code> et implémente explicitement chaque membre
m code> de l'interface
t code> en l'intervenant
foo.m code >. Une telle installation générale ne serait pas conquérienne avec des classes, même avec le support CLR, mais pourrait être très utile avec des interfaces si le CLR a fourni les caractéristiques nécessaires.
Le problème réel avec ce code est que vous héritez d'un paramètre de type.
essayer de compiler p> échouera toujours avec: Erreur CS0689: impossible de dériver de 'T' parce qu'il s'agit d'un paramètre de type. p> Je pense que cela serait parfaitement raisonnable au moins dans le cas des classes abstraites, et je voulais aussi cette fonctionnalité, mais le compilateur C # ne vous laissera pas fais ça. p> p>
+1 Pour mentionner le noyau du problème (dériver des paramètres de type).
qu'essayez-vous d'atteindre? Je ne peux pas vraiment penser à une situation où une telle contrainte serait nécessaire.