如何继承方法但具有不同的返回类型?

Pet*_*rdk 9 c# inheritance

鉴于以下课程:

ClassA
{
     public ClassA DoSomethingAndReturnNewObject()
     {}    
}

ClassB : ClassA
{}

ClassC : ClassA
{}
Run Code Online (Sandbox Code Playgroud)

有没有办法获取ClassBClassC继承方法,但自定义返回类型到自己的类?

我不想从ClassA复制方法并在那里更改类型.

ClassB打电话时需要拿一个物品ClassB.DoSomethingAndReturnNewObject().

ClassC打电话时需要拿一个物品ClassC.DoSomethingAndReturnNewObject().

像调用基于当前的类型像一个构造函数:this.GetType()?但我不知道如何实际做到这一点.

Meh*_*ari 8

不,您提到的功能称为返回类型协方差.它在C#中不受支持.

  • 正确.我们正在添加泛型方差,而不是返回类型协方差. (4认同)

Jos*_*eph 6

您所描述的是协变返回类型,C#不支持.

但是,您可以将ClassA创建为开放式泛型,并使封闭的泛型继承者返回自己的类型.

例:

public abstract class ClassA<T> where T: ClassA<T>, new()
{
    public abstract T DoSomethingAndReturnNewObject();
}

public class ClassB: ClassA<ClassB>
{
    public override ClassB DoSomethingAndReturnNewObject()
    {
        //do whatever
    }
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*nes 6

您需要创建一个受保护的虚拟方法供以下DoSomethingAndReturnNewObject使用:

class ClassA
{
    protected virtual ClassA Create()
    {
        return new ClassA()
    }

    public ClassA DoSomethingAndReturnNewObject()
    {
        ClassA result = Create();
        // Do stuff to result
        return result;
    }
}

class ClassB : ClassA
{
     protected override ClassA Create() { return new ClassB(); }
}

class ClassC : ClassA
{
     protected override ClassA Create() { return new ClassC(); }
}
Run Code Online (Sandbox Code Playgroud)

请注意,返回类型仍为ClassA,但对象实例类型将是特定类.