从父类方法返回子类的类型

use*_*515 7 c# inheritance

如果我有一个 classA和 classes BC并且D继承自A,有没有办法编写一个方法A,当在子类上调用时,会有子类的返回类型?

因此,如果我要这样做A.myMethod(),我会得到一个A,如果我要这样做B.myMethod(),我会得到一个B?

Dav*_*vid 5

您所要求的并不是严格的多态性,因为您想要覆盖返回类型,因此具有与原始方法不同的签名。真正的多态性不会更改此签名,因此您所要求的不是 C# 中的一流情况。

话虽这么说,至少有两种方法。

最简单的方法是重写方法,使用new关键字隐藏原始方法,允许您更改签名。

public new B MyMethod() { return (B)(base.MyMethod()); }
Run Code Online (Sandbox Code Playgroud)

这将允许 的任何用法B返回 a B,但实际上不会覆盖 的行为A.MyMethod。避免代码中的重复类型转换很有用。

如果您还需要重写该方法以允许它返回类型的对象B,则该方法不能共存于同一个类中,因为编译器会看到相同的签名(相同的名称,相同的参数,即使返回类型明显不同)。

第二种方法称为静态多态性,如果您使用某种工厂,则非常有用,但解决起来可能非常棘手,因为它只允许一级实际继承。静态多态类型以具有对其自身约束的通用组件的类型开始:

public class A<TSelf> where TSelf : A<TSelf> { }
public class B : A<B> { }
Run Code Online (Sandbox Code Playgroud)

这意味着您的方法可以返回类型的对象TSelf,甚至使其成为抽象方法,因此每个继承者都必须处理构造函数,但是继承自的任何类都B很难覆盖它,因为它是继承自A<B>,而不是A<C>