Переопределение метода возвращаемого метода интерфейса с производным классом в реализации

Я пытаюсь реализовать (С#) метод интерфейса в классе, возвращая производный тип вместо базового типа, как определено в интерфейсе:

interface IFactory
{
    BaseCar GetCar();
}

class MyFactory : IFactory
{
    MyCar GetCar()
    {
    }
}

Где, конечно:

class MyCar : BaseCar
{

}

Однако возникает следующая ошибка:

'MyFactory' не реализует член интерфейса 'IFactory.GetCar()'. "MyFactory.BaseCar()" не может реализовать IFactory.GetCar() ", потому что у него нет соответствующего типа возврата" BaseCar ".

Может ли кто-нибудь указать мне, почему это не удается, и как наилучшим образом его обойти?

Ответы

Ответ 1

Использовать Generics

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

class MyFactory : IFactory<MyCar>
{
    MyCar GetCar()
    {
    }
}


class MyCar : BaseCar
{

}

Ответ 2

Есть два способа сделать это. Вы можете использовать generics или явно реализовать элементы интерфейса.

Непатентованные

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

class MyFactory : IFactory<MyCar>
{
    MyCar GetCar()
    {
    }
}

Явно реализованные члены

interface IFactory
{
    BaseCar GetCar();
}

class MyFactory : IFactory
{
    BaseCar IFactory.GetCar()
    {
        return GetCar();
    }

    MyCar GetCar()
    {
    }
}

Ответ 3

Ваш метод GetCar должен вернуть BaseCar для реализации интерфейса. Как говорит ошибка, тип возвращаемого метода класса должен соответствовать типу возвращаемого метода интерфейса.

Ничего не мешает вам создать экземпляр MyCar, а затем вернуть это:

BaseCar GetCar()
{
    return new MyCar();
}

Альтернативой, если вы хотите получить типизированную версию нового класса, является использование дженериков по ответ Джона.