Переопределение метода интерфейса возвращаемого типа с производным классом в реализации - PullRequest
19 голосов
/ 19 декабря 2011

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

interface IFactory
{
    BaseCar GetCar();
}

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

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

class MyCar : BaseCar
{

}

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

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

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

Ответы [ 3 ]

21 голосов
/ 19 декабря 2011

Использование Generics

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

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


class MyCar : BaseCar
{

}
11 голосов
/ 01 февраля 2012

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

Универсальные элементы

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()
    {
    }
}
4 голосов
/ 19 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...