dot*_*NET 3 c# oop inheritance overriding
好。我想我明白之间的差别new
和override
。但是,如果我的理解是正确的,那不是new
违反OOP原则的关键词吗?有了它,我可以在子类中创建一个方法,该方法具有与基类不同的签名,对吗?像这样:
class MyBase
{
public int[] SampleMethod() { ... }
}
class MyChild : MyBase
{
public new string[] SampleMethod() { ... }
}
Run Code Online (Sandbox Code Playgroud)
客户希望从中继承的类MyBase
具有一个名为的方法SampleMethod
,该方法返回一个int
数组,但子类则没有。override
我认为这与要求子方法具有与父方法相同的签名不同。我想念什么?
问题出在您的声明中:
客户端希望从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概念无关。
归档时间: |
|
查看次数: |
751 次 |
最近记录: |