Surchargeant la méthode de l'interface type de retour avec classe dérivée dans la mise en œuvre
Je suis en train de mettre en œuvre (C#), une méthode d'interface dans une classe, le retour d'un type dérivé à la place du type de base tel que défini dans l'interface:
interface IFactory
{
BaseCar GetCar();
}
class MyFactory : IFactory
{
MyCar GetCar()
{
}
}
Où, bien sûr:
class MyCar : BaseCar
{
}
Cependant, l'erreur suivante se produit:
'MyFactory" ne pas implémenter l'interface membre 'IFactory.GetCar()'. 'MyFactory.BaseCar()' ne peut pas mettre en œuvre IFactory.GetCar ()", car il n'a pas la correspondance de type de retour de la 'BaseCar'.
Quelqu'un peut-il m'indiquer pourquoi cela échoue, et comment serait le meilleur moyen de le contourner?
C'est un doublon: “Interface pas mis en œuvre”, lors du Retour de Type Dérivé et polymorphisme pour les propriétés spécifiées par les interfaces
J'ai supprimé mon commentaire, désolé..
Merci @cody-gris, en quelque sorte manqué ces liens précédemment.
J'ai supprimé mon commentaire, désolé..
Merci @cody-gris, en quelque sorte manqué ces liens précédemment.
OriginalL'auteur iDPWF1 | 2011-12-19
Vous devez vous connecter pour publier un commentaire.
Utiliser Des Génériques
GetCar
dansMyFactory
doit être publique, etT
est covariant, de sorte que vous pouvez marquer en sorte avecout
sur l'interface, à l'aide de C# 4.0.Si BaseFactory implémente IFactory<BaseCar>, et DerivedFactory hérite BaseFactory mais implémente IFactory<DerivedCar>, il n'existe aucune garantie, lors de l'utilisation de la covariance, qui à l'aide d'un DerivedFactory comme un IFactory<BaseCar>, va utiliser le DerivedFactory mise en œuvre de GetCar?
OriginalL'auteur John Hartsock
Il y a 2 façons de le faire. Vous pouvez soit utiliser des génériques ou explicitement implémenter l'interface membres.
Génériques
Explicitement mis en œuvre les membres
OriginalL'auteur Eric
Votre
GetCar
méthode doit retourner unBaseCar
afin de mettre en œuvre l'interface. Comme le message d'erreur indique, la méthode de la classe de type de retour doit correspondre à l'interface de retour de la méthode type.Il n'y a rien qui vous empêche de créer une instance de
MyCar
, puis en la retournant:Une alternative, si vous voulez obtenir la version dactylographiée de la nouvelle classe, est d'utiliser des génériques comme par Jean de la réponse.
Bon point, corrigé.
Dans ce cas, il est, parce que GetCar() est utilisé par beaucoup d'autres dans les différents scénarios, où ils doivent retourner MyCar, MyOtherCar, etc., sans eux, sans avoir à lancer de BaseCar à chaque fois.
OriginalL'auteur George Duckett