gpt4 book ai didi

c# - 成员隐藏,其实际用途是什么

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:59 25 4
gpt4 key购买 nike

'new' modifier的实际用途是什么? ?

public class Base
{
public void Say()
{
Console.WriteLine("Base");
}
}

public class Derived:Base
{
public new void Say()
{
Console.WriteLine("Derived");
}
}

如果编译失败不是更好吗?这段代码:

        Derived d = new Derived();
d.Say();
((Base)d).Say();

返回

 Derived
Base

这不是破坏了里氏替换原则吗?

干杯。

最佳答案

关于LSP

这不会破坏 LSP。LSP 指出,如果 DerivedBase 的子类型,则任何依赖于 Base 的代码(例如,具有 Base 的方法 参数,如 void DoSomething(Base b)) 可以替换为 Derived 的实例,不会产生任何令人惊讶的效果。

正如您所指出的,如果您将 Derived 的实例分配给 Base 变量,将调用 Base 实现。

这是预期的行为,因为 Say 不是虚拟的。这意味着针对 Base 变量编写的代码需要调用 Base 实现。

实用目的

您可以将 new 方法视为一种规避不可覆盖方法的方法 - 需要注意的是!您必须针对该特定类型进行编程 - 而不是它的接口(interface)。

关于c# - 成员隐藏,其实际用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20656480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com