基类的相同方法的不同返回类型

Kon*_*rak 4 c# inheritance overriding

一个非常简单的基类:

class Figure {
    public virtual void Draw() {
        Console.WriteLine("Drawing Figure");
    }
}
Run Code Online (Sandbox Code Playgroud)

这个继承类:

class Rectangle : Figure
{
    public int Draw()
    {
        Console.WriteLine("Drawing Rectangle");
        return 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨Rectangle的"Draw"隐藏了Figure的Draw,并要求我添加一个newoverride关键字.只需添加即可new解决此问题:

class Rectangle : Figure
{
    new public int Draw() //added new
    {
        Console.WriteLine("Drawing Rectangle");
        return 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Figure.Draw有一个void返回类型,Rectangle.Draw返回一个int.我很惊讶这里允许不同的返回类型...为什么?

Dam*_*ver 6

你真的读过new修饰语吗?

使用new修饰符显式隐藏从基类继承的成员.要隐藏继承的成员,请使用相同的名称在派生类中声明它,并使用new修饰符对其进行修改.

所以,你已经隐藏了基类的版本.这两个方法具有相同名称的事实并不意味着什么 - 它们与两个名称听起来相同的方法没有关系.


通常应避免这种情况,但编译器将始终知道要调用哪个方法,从而知道它是否具有返回值.如果访问"the"方法如下:

Figure r = new Rectangle();
r.Draw();
Run Code Online (Sandbox Code Playgroud)

然后将调用Figures Draw方法.没有产生任何回报价值,也没有预期.