具有协变返回类型方法的子类,解决方法?

时间:2014-05-27 08:34:03

标签: c# inheritance covariance

我正在尝试整齐地组织我的代码,并且作为主要以Java为中心的程序员遇到并且奇怪。这是简化版本:

class ReturnParent { ... }
class ReturnChild : ReturnParent { ... }

class Parent
{
    abstract ReturnParent SomeMethod();    
}

class Child : Parent
{
    // Note the return type
    override ReturnChild SomeMethod() {}
}

现在我已经查找了这个问题,我知道这在C#中不起作用,因为这种方式不支持协方差。我的问题是,这个问题有解决办法吗?

该方法可以是参数;类,包括返回类,必须是类,它们不能是接口;他们可以实现接口,如果有帮助的话。

此外,主类必须是可转换的,这在我尝试泛型时是个问题:

    Parent p = new Child(); // This works
    Child c = p as Child; // This doesn't work with generics

2 个答案:

答案 0 :(得分:3)

您可以让子类决定SomeMethod的返回类型。

abstract class Parent<TReturn> where TReturn : ReturnParent
{
    public abstract TReturn SomeMethod();    
}

class Child : Parent<ReturnChild>
{
    public override ReturnChild SomeMethod(){}
}

如果您让Parent<T>实施以下协变界面,那么您可以将Child投射到IParent<ReturnParent>

interface IParent<out T>
{
    T SomeMethod(); 
} 

如果你想将专门转换为Parent<ReturnParent>,那么不,那是不可能完成的,你可能需要重新设计。

答案 1 :(得分:1)

这适用于Linqpad

abstract class Parent<T>
{
    public abstract T SomeMethod();    
}

class Child : Parent<ReturnChild>
{
    // Note the return type
    public override ReturnChild SomeMethod()
    {
       return new ReturnChild();
    }
}

void Main()
{ 
    var p = new Child(); // This works
    Child c = p as Child; // This doesn't work with generics
}