Interface avec le paramètre générique vs Interface avec les méthodes génériques
Disons que j'ai une telle interface et la mise en œuvre concrète
public interface IMyInterface<T>
{
T My();
}
public class MyConcrete : IMyInterface<string>
{
public string My()
{
return string.Empty;
}
}
J'ai donc créer MyConcrete mise en œuvre pour strings
, je peux en avoir un de plus concret à la mise en œuvre de int
. Et c'est ok. Mais disons, que je veux faire la même chose, mais avec des méthodes génériques, j'ai donc
public interface IMyInterface2
{
T My<T>();
}
public class MyConcrete2 : IMyInterface2
{
public string My<string>()
{
throw new NotImplementedException();
}
}
Donc, j'ai le même IMyInterface2
, mais qui définit le comportement générique par le biais de T My<T>()
. Dans ma classe de béton je veux mettre en œuvre My
comportement, mais pour le béton de type de données string
. Mais le C# ne m'autorise pas à le faire.
Ma question est: pourquoi je ne peut pas le faire?
En d'autres termes, si je peux créer une mise en œuvre concrète de MyInterface<T>
comme MyClass : MyInterface<string>
et arrêter le caractère générique à ce point, pourquoi je ne peux pas le faire avec la méthode générique - T My<T>()
?
- Vous ne pouvez pas réduire les capacités lorsque vous héritez, vous pouvez uniquement ajouter à eux.
Vous devez vous connecter pour publier un commentaire.
Votre méthode générique de la mise en œuvre doit être générique, donc il doit être:
Pourquoi vous ne pouvez pas faire
My<string>()
ici? Parce que l'interface de contrat a besoin d'une méthode, qui peut être appelée à n'importe quel type de paramètreT
et que vous avez à remplir ce contrat.Pourquoi vous ne pouvez pas arrêter le caractère générique de ce point de? Parce que ce serait provoquer des situations comme suit:
Déclarations de classe:
Utilisation:
T My<T>()
My<string>
mise en œuvre serait un échec.lorsque vous écrivez la Méthode Générique de la Définition est pour le maintien de l'emplacement réservé. Type réel entre en image lorsque vous appelez la méthode. donc, au lieu de cela, vous devez écrire
et lorsque vous appelez la méthode, vous pouvez utiliser la chaîne de caractères qui existe.
Parce que votre interface déclare une méthode générique
T My<T>()
, mais vous la mise en œuvre ne permet pas de mettre en œuvre une fonction avec cette signature.À réaliser ce que vous voulez, vous devez fournir les T paramètre générique de l'interface au lieu de cela, dans votre premier exemple:
Votre solution ne fonctionne pas pour deux raisons.
Tout d'abord, une interface est un contrat. Lorsque vous implémentez
IMyInterface2
vous garantir que vous allez mettre en œuvre une fonction nomméeMy
qui prend un paramètre de type générique et renvoie ce type.MyConcrete2
ne pas faire cela.Deuxième, C# génériques ne permettent pas de tout type de paramètre de type de spécialisation. (Je ne souhaite C# appuyé.) C'est une chose commune dans les modèles C++ où votre exemple serait de compiler, mais toutes les utilisations de
MyConcrete2
de ne pas compiler si ils ne le font pas appelMy
avec unstring
.