在实现中覆盖接口方法返回类型和派生类

iDP*_*WF1 19 c# polymorphism interface

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

interface IFactory
{
    BaseCar GetCar();
}

class MyFactory : IFactory
{
    MyCar GetCar()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

当然在哪里:

class MyCar : BaseCar
{

}
Run Code Online (Sandbox Code Playgroud)

但是,会发生以下错误:

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

任何人都可以指出我为什么会失败,如何解决它的最佳方法?

Joh*_*ock 22

使用泛型

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

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


class MyCar : BaseCar
{

}
Run Code Online (Sandbox Code Playgroud)


小智 11

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

泛型

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

class MyFactory : IFactory<MyCar>
{
    MyCar GetCar()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

明确实施的成员

interface IFactory
{
    BaseCar GetCar();
}

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

    MyCar GetCar()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


Geo*_*ett 5

您的GetCar方法必须返回 aBaseCar才能实现该接口。正如错误所说,类的方法的返回类型必须与接口的方法的返回类型匹配。

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

BaseCar GetCar()
{
    return new MyCar();
}
Run Code Online (Sandbox Code Playgroud)

如果您想获得新类的类型化版本,另一种方法是按照John 的回答使用泛型。