C# 使用实现中的派生类重写接口方法返回类型
我试图在类中实现(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()
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()
{
}
}