gpt4 book ai didi

c# - 从父类方法返回子类的类型

转载 作者:行者123 更新时间:2023-11-30 12:09:18 26 4
gpt4 key购买 nike

如果我有一个类A和类 B , C , 和 D继承自 A ,有没有办法在A中写一个方法那,当在子类上调用时,将具有子类的返回类型?

所以如果我要做 A.myMethod() ,我会得到一个 A , 如果我要做 B.myMethod() , 我会得到 B 的实例?

最佳答案

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

话虽如此,至少有两种方法。

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

public new B MyMethod() { return (B)(base.MyMethod()); }

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

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

第二种方法称为静态多态性,如果您正在使用某种工厂,它会非常有用,但变通起来会非常棘手,因为它只允许一个级别的实际继承.静态多态类型以具有针对自身约束的通用组件的类型开始:

public class A<TSelf> where TSelf : A<TSelf> { }
public class B : A<B> { }

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

关于c# - 从父类方法返回子类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27993057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com