“ new”关键字(用于方法)和OOP

dot*_*NET 3 c# oop inheritance overriding

好。我我明白之间的差别newoverride。但是,如果我的理解是正确的,那不是new违反OOP原则的关键词吗?有了它,我可以在子类中创建一个方法,该方法具有与基类不同的签名,对吗?像这样:

class MyBase
{
    public int[] SampleMethod() { ... }
}

class MyChild : MyBase
{
    public new string[] SampleMethod() { ... }
}
Run Code Online (Sandbox Code Playgroud)

客户希望从中继承的类MyBase具有一个名为的方法SampleMethod,该方法返回一个int数组,但子类则没有。override认为这与要求子方法具有与父方法相同的签名不同。我想念什么?

Kir*_*oll 5

问题出在您的声明中:

客户端希望从MyBase继承的类具有一个名为SampleMethod的方法,该方法返回一个int数组,但子类则没有。

这是不正确的。实际上,该类确实实现了该方法。它只是实现了自己的版本。

如果MyChild声明了的实例:

MyBase myBase = new MyChild();
Run Code Online (Sandbox Code Playgroud)

这行:

int[] ints = myBase.SampleMethod();
Run Code Online (Sandbox Code Playgroud)

有效,并调用您期望的方法。相反,此行:

string[] strings = myBase.SampleMethod();
Run Code Online (Sandbox Code Playgroud)

会失败。但是,如果将其强制转换为MyChild

string[] strings = ((MyChild)myBase).SampleMethod();
Run Code Online (Sandbox Code Playgroud)

这完全符合您的预期。

这里的要点是,由于该变量是已知的MyBase,所以无论您new实现什么,它的行为都将完全符合您的期望。因此,多态性-因为它对编译时类型作出反应-不受影响,并且与任何OOP概念无关。