鉴于以下课程:
ClassA
{
public ClassA DoSomethingAndReturnNewObject()
{}
}
ClassB : ClassA
{}
ClassC : ClassA
{}
Run Code Online (Sandbox Code Playgroud)
有没有办法获取ClassB和ClassC继承方法,但自定义返回类型到自己的类?
我不想从ClassA复制方法并在那里更改类型.
我ClassB打电话时需要拿一个物品ClassB.DoSomethingAndReturnNewObject().
我ClassC打电话时需要拿一个物品ClassC.DoSomethingAndReturnNewObject().
像调用基于当前的类型像一个构造函数:this.GetType()?但我不知道如何实际做到这一点.
您所描述的是协变返回类型,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)
您需要创建一个受保护的虚拟方法供以下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,但对象实例类型将是特定类.