2011-12-19 83 views
15

我试图执行(C#)在一个类的接口方法,如在接口中定义的返回派生类型来代替基本类型的:重写接口的方法返回类型

interface IFactory 
{ 
    BaseCar GetCar(); 
} 

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

其中当然:

class MyCar : BaseCar 
{ 

} 

但是,下面的错误发生:

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

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

+0

这是一个重复:[“接口没有实现”返回派生类型时(http://stackoverflow.com/questions/1121283/ interface-not-implemented-when-returning-derived-type)和[由接口指定的属性的多态性](http://stackoverflow.com/questions/3670069/polymorphism-for-properties-specified-by-interfaces) – 2011-12-19 16:53:15

+0

@奥斯汀我删除了我的评论对不起.. – MethodMan 2011-12-19 17:12:03

+0

谢谢@cod y-灰色,不知何故错过了以前的这些链接。 – iDPWF1 2011-12-20 07:32:57

回答

16

使用泛型

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

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


class MyCar : BaseCar 
{ 

} 
+0

'MyFactory'中的'GetCar'应该是公共的,'T'是协变的,所以如果使用C#4.0的话,你可以用'out'标记它。 – vcsjones 2011-12-19 16:58:45

+0

@vcsjones:如果BaseFactory实现IFactory 并且DerivedFactory继承BaseFactory但实现IFactory ,那么在使用协方差时,是否有任何保证使用DerivedFactory作为IFactory 将使用GetCar的DerivedFactory实现? – supercat 2011-12-19 17:29:46

4

您的GetCar方法必须返回BaseCar以实现该接口。如错误所述,类的方法的返回类型必须匹配接口的方法的返回类型。

没有什么阻止你创建的MyCar一个实例,然后返回是:

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

的选择,如果你想获得新类的类型版本,是使用泛型按John's answer

+1

你真的需要演员吗? – 2011-12-19 16:53:32

+0

好点,更正。 – 2011-12-19 16:55:22

+0

在这种情况下,由于GetCar()被许多其他人在不同的场景中使用,他们需要返回MyCar,MyOtherCar等,而不必每次都从BaseCar转换它。 – iDPWF1 2011-12-20 07:29:27

7

有2种方式来做到这一点。您可以使用泛型,也可以显式实现接口成员。

泛型

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