C#中如何在子类的override方法中重写子类型?我有一个带有覆盖方法的子类,我知道它总是返回基类中声明的返回类型的特定子类型。如果我以这种方式编写代码,它将无法编译。由于这可能没有意义,让我给出一个代码示例:}classDerivedClass:BaseClass{//编译错误:返回类型必须是'BaseReturnType'才能匹配//覆盖的成员'BaseClass.PolymorphicMethod()'publicoverrideDerivedReturnTypePolymorphicMethod(){returnnewDerivedReturnType();有没有办法在C#中实现这一点?如果没有,实现类似目标的最佳方法是什么?为什么不允许这样做?它似乎不允许任何逻辑上的不一致,因为从覆盖方法返回的任何对象仍然是BaseReturnType。也许有些事情我没有考虑过。或者原因可能是技术或历史。遗憾的是,C#不支持方法重写的协变返回类型。(同上逆变参数类型。)如果你正在实现一个接口,你可以用一个“弱”版本显式地实现它,并提供一个具有更强契约的公共版本。恐怕你没有简单地覆盖父类的奢侈:((编辑:Marc有一个合理的解决方案——虽然它很丑陋,但隐藏方法通常不利于可读性。没有冒犯的意思,Marc;)我相信这实际上是CLR限制,而不仅仅是语言限制——但我可能是错的。(作为一个历史问题,Java(语言)在1.5之前有相同的限制-但它与泛型一起获得了协变性。)如果这不困扰你,你可以使这个类泛型:classBaseReturnType{}classDerivedReturnType:BaseReturnType{}抽象类BaseClass其中T:BaseReturnType{publicabstractTPolymorphicMethod();}classDerivedClass:BaseClass{//错误:返回类型必须是'BaseReturnType'才能匹配//覆盖的成员'BaseClass.PolymorphicMethod()'publicoverrideDerivedReturnTypePolymorphicMethod(){returnnewDerivedReturnType();如果引入一个额外的方法来重写(因为你不能重写和新建一个具有相同类型的相同名称的方法),你可以这样做:}受保护的抽象BaseReturnTypePolymorphicMethodCore();}classDerivedClass:BaseClass{protectedoverrideBaseReturnTypePolymorphicMethodCore(){returnPolymorphicMethod();}publicnewDerivedReturnTypePolymorphicMethod(){returnnewDerivedReturnType();现在,您在每个级别都有一个具有正确类型的PolymorphicMethod。泛型不一定是要走的路。特别是,(派生)类型不被视为(基本)类型。首先,向派生类添加一个新方法,该方法将返回一个具有正确类型的值。其次,将覆盖方法标记为不可覆盖,并将其委托给新方法。就这样。你已经解决了这个问题。子类将无法重新扩展该类型,因为它们必须重写您的新方法。如果代码有误,我深表歉意;我习惯了VB.net。抽象类C1{公共抽象IEnumerableF1();}classC2:C1{publicsealedoverrideIEnumerableF1(){ReturnF2();}publicoverridableIListF2(){Return{1,2,3,4};}}classBaseReturnType{}classDerivedReturnType:BaseReturnType{}抽象类BaseClass{publicabstractBaseReturnTypePolymorphicMethod();}classDerivedClass:BaseClass{//错误:返回类型必须是'BaseReturnType'才能匹配//overriddenPormphicmemberly'()'publicoverrideBaseReturnTypePolymorphicMethod(){returnnewDerivedReturnType();这应该有效将派生类的方法签名更改为:publicoverrideBaseReturnTypePolymorphicMethod(){returnnewDerivedReturnType();}C#不支持变量返回类型。您可以查看本文以了解如何使用泛型...http://srtsolutions.com/blogs/billwagner/archive/2005/06/17/covaraint-return-types-in-c.aspx以下是使用模型中泛型的示例:}publicclassDerviedClass:BaseClass{publicoverrideDerivedReturnTypePolymorphicMethod(){thrownewNotImplementedException();在我看来,您需要返回一个接口,而不是基类。以上就是C#学习教程:C#中子类的重写方法中如何重写子类型?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
