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

鉴于以下类别:

ClassA { public ClassA DoSomethingAndReturnNewObject() {} } ClassB : ClassA {} ClassC : ClassA {} 

有没有办法让ClassBClassCinheritance该方法,但将返回类型自定义为自己的类?

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

当我调用ClassB.DoSomethingAndReturnNewObject()时,我需要获取一个ClassB对象。

当我调用ClassC.DoSomethingAndReturnNewObject()时,我需要获得一个ClassC对象。

比如基于当前类型调用构造函数,比如: this.GetType() ? 但我不知道如何真正做到这一点。

您需要为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(); } } 

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

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

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

但是,您可以将ClassA创建为开放式generics,并使封闭的genericsinheritance者返回自己的类型。

例:

 public abstract class ClassA where T: ClassA, new() { public abstract T DoSomethingAndReturnNewObject(); } public class ClassB: ClassA { public override ClassB DoSomethingAndReturnNewObject() { //do whatever } } 
 class ClassA where T : ClassA, new() { public T DoSomethingAndReturnNewObject() { return new T(); } } class ClassB : ClassA { } class ClassC : ClassA { } 

测试:

 ClassB b1 = new ClassB(); ClassB b2 = b1.DoSomethingAndReturnNewObject(); // returns instance of ClassB 

嗯,正确的答案是否定的,一般来说,这是一个坏主意。 如果你要回到完全不同的东西,那么找另一种方式。

但是,如果您没有返回完全不同的东西,那么界面可以解决您的问题。 而不是返回一个类,返回一个接口,让类A,B和C返回以他们认为合适的方式实现该接口的对象。

这不是inheritance,因为方法的返回类型是其签名的一部分。 你没有改变方法,你将创建一个全新的方法。

你有一些选择。 例如,您可以使方法DoSomethingAndReturnNewObject成为基于generics的方法,并让它返回其generics类型。 这可能是您正在寻找的确切行为的最直接途径。

另一种方法是按原样保留方法签名,并让子类方法返回ClassBClassC实例。 然后客户端代码需要负责转换,以便将这些对象用作适当的派生类。

有没有什么理由ClassA的通用接口是不够的? 如果您正确地派生和覆盖了虚拟成员,那么多态性将为您提供正确的function,如果您只使用ClassA成员。

也许仿制药会成为你的救星。 看一下这个链接: C#Generics Part 3/4:Casting,Inheritance和Generic Methods

 bstract class B { public abstract T Fct(T t); } class D1 : B{ public override string Fct( string t ) { return "hello"; } } class D2 : B{ public override T Fct(T t) { return default (T); } } 

我终于设计了以下解决方案。 对于我的情况,它足够有用,但它假设ClassA知道它的衍生物并且仅限于这两个选项。 不是高层次的思考,但它有效。 🙂

 ClassA { public ClassA DoSomethingAndReturnNewObject() { if (this.GetType() == typeOf(ClassB)) { return new ClassB(values); } else { return new ClassC(values): } } } ClassB : ClassA {} ClassC : ClassA {} 

我认为您需要使用新的返回类型创建一个新函数并在另一个函数内部调用,并操纵返回的类型。 否则就不符合逻辑! (与inheritance的定义/想法)

有一个真正简单的答案:使所有方法返回类型“对象”。 你显然会返回不同类型,字符串和整数以及其他东西,并且它们会在到达目的地后保持原样。 但编译器非常高兴 – 一切都是“对象”。 你确实放弃了编译时类型检查,这不是一件好事,但是对于某些深度OO编程而言,每隔一段时间就会有回报是值得的。