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

本文关键字:方法 子类 解决 返回类型 | 更新日期: 2023-09-27 18:05:13

我试图整齐地组织我的代码,并遇到了一个主要以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

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

可以让子类决定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>,那么不,那不能做,你可能需要重新设计

这适用于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
}