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

时间:2011-12-19 16:49:35

标签: c# interface polymorphism

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

interface IFactory
{
    BaseCar GetCar();
}

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

当然在哪里:

class MyCar : BaseCar
{

}

但是,会发生以下错误:

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

任何人都可以指出为什么会失败,以及如何解决这个问题的最佳方式?

3 个答案:

答案 0 :(得分:21)

使用泛型

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

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


class MyCar : BaseCar
{

}

答案 1 :(得分:11)

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

泛型

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()
    {
    }
}

答案 2 :(得分:4)

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

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

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

另一种方法是,如果要获取新类的类型版本,则按照John's answer使用泛型。