Remplacement du type de retour de méthode d’interface avec la classe dérivée dans l’implémentation

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 .