这或多或少是一个完全相同的副本这个帖子 https://stackoverflow.com/questions/3117838/why-do-we-need-the-new-keyword-and-why-is-the-default-behavior-to-hide-and-not-ov,但由于我无法编辑它,所以我开始了这个。请随意移动某些内容并关闭此内容。
使用 new 隐藏方法似乎是一个危险的功能,并且考虑到另一个线程中的讨论,似乎不仅仅是我在为此找到有效的用例时遇到问题。任何接受 Base 的方法都不会使用 Derived 的方法。
public class Base
{
public void Method()
{
Console.WriteLine("Base");
}
}
public class Derived : Base
{
public new void Method()
{
Console.WriteLine("Derived");
}
}
var derived = new Derived();
derived.Method(); // "Derived"
((Base)derived).Method(); // "Base"
那么,有哪些新功能难以用其他功能解决的有效用例呢?
这个想法是为了避免脆弱的基类 https://ericlippert.com/category/brittle-base-classes/问题尽量解决。
假设您提供一个库,而我从您的一个类中派生。我创造了自己的方法,Foo()
,并适当地调用它。美好的。
现在您引入库的第二个版本,并添加Foo()
方法(具有相同的签名)到基类。现在你的代码将调用Foo()
,它有一个特殊的含义......这可能是完全不同对我的意义Foo()
方法。默认行为(以及添加new
修饰符)是为了让事物按其应有的方式运行:只知道基类的代码将调用您的方法 - 这很好,因为这就是它们的意思。使用具有派生类的编译时类型的表达式的代码将使用my方法 - 没关系,因为这就是they应该也是这个意思(基本上它只能是我的代码,因为只有我的代码知道我的类。)
它应该usually避免 - 它可能会导致微妙的错误,其中更改变量的编译时类型会默默地改变行为......但它是针对这种情况而存在的。基本上,向基类添加方法不应尽可能破坏派生类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)