C# 使用实现中的派生类重写接口方法返回类型

C# 使用实现中的派生类重写接口方法返回类型,c#,interface,polymorphism,C#,Interface,Polymorphism,我试图在类中实现(C#)接口方法,返回派生类型,而不是接口中定义的基类型: interface IFactory { BaseCar GetCar(); } class MyFactory : IFactory { MyCar GetCar() { } } 当然,其中: class MyCar : BaseCar { } 但是,会发生以下错误: “MyFactory”未实现接口成员“IFactory.GetCar()”MyFactory.BaseCar()

我试图在类中实现(C#)接口方法,返回派生类型,而不是接口中定义的基类型:

interface IFactory
{
    BaseCar GetCar();
}

class MyFactory : IFactory
{
    MyCar GetCar()
    {
    }
}
当然,其中:

class MyCar : BaseCar
{

}
但是,会发生以下错误:

“MyFactory”未实现接口成员“IFactory.GetCar()”MyFactory.BaseCar()无法实现IFactory.GetCar(),因为它没有匹配的返回类型“BaseCar”


有人能告诉我为什么会失败,以及如何解决它的最佳方法吗?

为了实现接口,您的
GetCar
方法必须返回
BaseCar
。正如错误所说,类的方法的返回类型必须与接口的方法的返回类型匹配

没有什么能阻止您创建
MyCar
的实例,然后返回该实例:

BaseCar GetCar()
{
    return new MyCar();
}
如果要获取新类的类型化版本,另一种方法是按照使用泛型。

使用泛型

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

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


class MyCar : BaseCar
{

}
接口i工厂,其中T:BaseCar
{
T GetCar();
}
类别MyFactory:IFactory
{
我的车
{
}
}
MyCar类:基准车
{
}

实现这一点有两种方法。您可以使用泛型或显式实现接口成员

仿制药

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

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

这是一个重复:,感谢@cody gray,之前不知怎么错过了这些链接。
MyFactory
中的
GetCar
应该是公共的,而
T
是协变的,因此,如果使用C#4.0,您可以在界面上用
out
标记它。@vcsjones:如果BaseFactory实现了IFactory,而DerivedFactory继承了BaseFactory但实现了IFactory,那么在使用协方差时,是否可以保证使用DerivedFactory作为IFactory将使用GetCar的DerivedFactory实现?在这种情况下,有,因为GetCar()被许多其他人在不同的场景中使用,他们需要返回MyCar、MyOtherCar等,而不必每次都从BaseCar中抛出它。
interface IFactory
{
    BaseCar GetCar();
}

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

    MyCar GetCar()
    {
    }
}