Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding interface method return type with derived class in implementation

Tags:

I am trying to implement (C#) an interface method in a class, returning a derived type instead of the base type as defined in the interface:

interface IFactory {     BaseCar GetCar(); }  class MyFactory : IFactory {     MyCar GetCar()     {     } } 

Where, of course:

class MyCar : BaseCar {  } 

However, the following error happens:

'MyFactory' does not implement interface member 'IFactory.GetCar()'. 'MyFactory.BaseCar()' cannot implement IFactory.GetCar()' because it does not have the matching return type of 'BaseCar'.

Can anyone point me as to why this fails, and how would be the best way to work around it?

like image 948
iDPWF1 Avatar asked Dec 19 '11 16:12

iDPWF1


2 Answers

Use Generics

interface IFactory<T> where T: BaseCar {     T GetCar(); }  class MyFactory : IFactory<MyCar> {     MyCar GetCar()     {     } }   class MyCar : BaseCar {  } 
like image 186
John Hartsock Avatar answered Oct 20 '22 02:10

John Hartsock


There are 2 ways to accomplish this. You can either use generics or explicitly implement interface members.

Generics

interface IFactory<T> where T: BaseCar {     T GetCar(); }  class MyFactory : IFactory<MyCar> {     MyCar GetCar()     {     } } 

Explicitly implemented members

interface IFactory {     BaseCar GetCar(); }  class MyFactory : IFactory {     BaseCar IFactory.GetCar()     {         return GetCar();     }      MyCar GetCar()     {     } } 
like image 30
Eric Avatar answered Oct 20 '22 01:10

Eric