C#语言规范说如果我继承了一个类,并且基类和派生类具有相同签名的相同命名成员,那么我必须使用该new关键字来隐藏基类成员(使用虚拟还有另一种方法)和覆盖基类和派生类成员中的关键字).
但实际上我发现如果派生类具有相同的命名成员,派生类会自动隐藏派生成员.那么同一个命名派生类成员中的新关键字的主要好处和问题是什么?
Eri*_*ert 27
正如您所注意到的,不需要新功能.它是可选的,如果你不使用它,你会收到警告.你完全正确地注意到这是一个奇怪的设计决定.
此设计决策的目的是帮助缓解一类被称为"脆弱基类"问题的问题.这是该问题的一个版本:
Foo Corporation创建了一个类Frobber并将其发布到Foo.DLL 1.0版中:
namespace FooCorp
{
public class Frobber
{
public void Frobnicate() { ... }
...
Run Code Online (Sandbox Code Playgroud)
你工作的律师事务所,制作Blobbers.Blobber可以做Frobber可以做的所有事情,但此外,它也可以做Blobnicate.所以你决定从FooCorp重新使用Frobnicate的实现,并添加一些额外的功能:
namespace BarCorp
{
public class Blobber : FooCorp.Frobber
{
public void Blobnicate() { ... }
...
Run Code Online (Sandbox Code Playgroud)
Foo公司意识到人们喜欢Blobnicate,他们决定运送Foo.DLL v2.0:
namespace FooCorp
{
public class Frobber
{
public void Frobnicate() { ... }
public void Blobnicate() { ... }
...
Run Code Online (Sandbox Code Playgroud)
当您获得新版本的Foo.DLL并重新编译时,您希望被告知您现在意外地引入了一种隐藏基类方法的新方法.这可能是一件危险的事情; 你的类是在假设基类是Frobnicator的情况下编写的,但显然现在它也是一个Blobnicator!这个事实可能会破坏您的客户,他们可能会在打算调用派生类版本时意外调用基类版本.
我们使"new"可选,因此在不更改源代码的情况下隐藏基类方法是合法的.如果我们将其设为非法,那么FooCorp会因升级而破坏您的构建.但我们会发出警告,以便您知道您可能会意外地这样做.然后,您可以仔细检查代码; 如果您确定您的Blobnicate实现现在是多余的,则可以将其删除.如果仍然良好,您可以将其标记为"新"并消除警告.
合理?这是C#的一个微妙特性,使其适用于大规模多版本组件导向软件.