Ответ 1
Использовать Generics
interface IFactory<T> where T: BaseCar
{
T GetCar();
}
class MyFactory : IFactory<MyCar>
{
MyCar GetCar()
{
}
}
class MyCar : BaseCar
{
}
Я пытаюсь реализовать (С#) метод интерфейса в классе, возвращая производный тип вместо базового типа, как определено в интерфейсе:
interface IFactory
{
BaseCar GetCar();
}
class MyFactory : IFactory
{
MyCar GetCar()
{
}
}
Где, конечно:
class MyCar : BaseCar
{
}
Однако возникает следующая ошибка:
'MyFactory' не реализует член интерфейса 'IFactory.GetCar()'. "MyFactory.BaseCar()" не может реализовать IFactory.GetCar() ", потому что у него нет соответствующего типа возврата" BaseCar ".
Может ли кто-нибудь указать мне, почему это не удается, и как наилучшим образом его обойти?
Использовать Generics
interface IFactory<T> where T: BaseCar
{
T GetCar();
}
class MyFactory : IFactory<MyCar>
{
MyCar GetCar()
{
}
}
class MyCar : BaseCar
{
}
Есть два способа сделать это. Вы можете использовать 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()
{
}
}
Ваш метод GetCar
должен вернуть BaseCar
для реализации интерфейса. Как говорит ошибка, тип возвращаемого метода класса должен соответствовать типу возвращаемого метода интерфейса.
Ничего не мешает вам создать экземпляр MyCar
, а затем вернуть это:
BaseCar GetCar()
{
return new MyCar();
}
Альтернативой, если вы хотите получить типизированную версию нового класса, является использование дженериков по ответ Джона.