J’essaie d’implémenter (C #) une méthode d’interface dans une classe, renvoyant 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’ n’implémente pas le membre d’interface ‘IFactory.GetCar ()’. ‘MyFactory.BaseCar ()’ ne peut pas implémenter IFactory.GetCar () ‘car il ne possède pas le type de retour correspondant à’ BaseCar ‘.
Quelqu’un peut-il m’indiquer pourquoi cela a échoué et quelle serait la meilleure façon de le contourner?
Utiliser des génériques
interface IFactory where T: BaseCar { T GetCar(); } class MyFactory : IFactory { MyCar GetCar() { } } class MyCar : BaseCar { }
Il y a 2 façons d’accomplir cela. Vous pouvez utiliser des génériques ou implémenter explicitement des membres d’interface.
Génériques
interface IFactory where T: BaseCar { T GetCar(); } class MyFactory : IFactory { MyCar GetCar() { } }
Membres explicitement implémentés
interface IFactory { BaseCar GetCar(); } class MyFactory : IFactory { BaseCar IFactory.GetCar() { return GetCar(); } MyCar GetCar() { } }
Votre méthode GetCar
doit renvoyer un BaseCar
pour implémenter l’interface. Comme le dit l’erreur, le type de retour de la méthode de la classe doit correspondre au type de retour de la méthode de l’interface.
Rien ne vous empêche de créer une instance de MyCar
, puis de le renvoyer:
BaseCar GetCar() { return new MyCar(); }
Une autre solution, si vous souhaitez obtenir la version typescripte de la nouvelle classe, consiste à utiliser des génériques conformément à la réponse de John .