C#可以覆盖派生类的返回类型吗?

时间:2017-05-18 14:16:03

标签: c# inheritance override

class base{
    ....
    public string name();
    ....
}

class deriveda : base{
    ....
    public override string name();
    ....
}

class derivedb : base{
    ....
    public override string name();
    ....
}

class derivedc : base{
    ....
    public override foo name();
    ....
}

在我的大多数派生类中,它是一致的,但其中一个我想返回自定义类类型,这可能吗?

3 个答案:

答案 0 :(得分:5)

简短的回答是否定的。

想一想,以后你将如何使用它?

base b = new derivedc ()

然后呢? b.name()的返回类型是什么? stringfoo

然而,您可以使用泛型来控制它(虽然我不确定它是否适合您的使用案例):

class base<T>{
    ....
    public virtual T name();
    ....
}

class deriveda : base<string>{
    ....
    public override string name();
    ....
}

class derivedb : base<string>{
    ....
    public override string name();
    ....
}

class derivedc : base<foo>{
    ....
    public override foo name();
    ....
}

答案 1 :(得分:0)

在c#9中,,只要新类型满足协方差规则,特别是衍生性更高的引用类型,这应该是可能的。这样就可以了。

答案 2 :(得分:-2)

,这是不可能的。正如其他人所指出的,编译器无法区分仅在返回类型上有所不同的函数(因为返回类型不是函数签名的一部分)。

一种解决方法(在您的情况下可能不起作用)是让您的返回类型成为基类函数的返回类型的子类,如here所述。但是,foo不能从string派生,因为string是一个密封类。您可以从预定义类型(如字符串)派生的最接近的方法是定义字符串扩展方法,如图所示here

Ofir的回答可能是你最好的选择,但这可能会给你其他想法。