gpt4 book ai didi

c# - 在与基类成员同名的派生类成员中使用 new 关键字的好处

转载 作者:可可西里 更新时间:2023-11-01 07:50:52 25 4
gpt4 key购买 nike

C# 语言规范说,如果我继承了一个类,并且基类和派生类具有相同的命名成员和相同的签名,那么我必须使用 new 关键字来隐藏基类成员(还有一种方法是在基类和派生类成员中使用 virtual 和 override 关键字)。

但在实践中我发现,如果派生类具有相同的命名成员,则派生类会自动隐藏派生成员。那么同名派生类成员中的新关键字的主要好处和问题是什么?

最佳答案

如您所述,不需要 新的。它是可选的,如果您不使用它,您会收到警告。乍一看这是一个奇怪的设计决定,您是完全正确的。

此设计决策的目的是帮助缓解称为“脆弱基类”问题的一类问题。这是该问题的一个版本:

Foo Corporation 创建了一个类 Frobber 并将其发布在 Foo.DLL 版本 1.0 中:

namespace FooCorp
{
public class Frobber
{
public void Frobnicate() { ... }
...

您为之工作的 Bar Corporation 生产 Blobbers。 Blobber 可以做 Frobber 可以做的所有事情,但除此之外,它还可以 Blobnicate。因此,您决定重新使用 FooCorp 的 Frobnicate 实现,并添加一些额外的功能:

namespace BarCorp
{
public class Blobber : FooCorp.Frobber
{
public void Blobnicate() { ... }
...

Foo Corporation 意识到人们喜欢 Blobnicate,他们决定发布 Foo.DLL v2.0:

namespace FooCorp
{
public class Frobber
{
public void Frobnicate() { ... }
public void Blobnicate() { ... }
...

当您获得新版本的 Foo.DLL 并重新编译时,您希望被告知您现在不小心引入了一个隐藏基类方法的新方法。这可能是一件危险的事情去做;您的类(class)是在假设基类是 Frobnicator 的情况下编写的,但显然现在它也是一个 Blobnicator!这一事实可能会破坏的客户,他们可能会在打算调用您的派生类版本时意外调用基类版本。

我们将“new”设为可选,这样您就可以合法隐藏基类方法而不更改源代码。如果我们将其定为非法,那么 FooCorp 会通过升级破坏您的构建。但我们将其设为警告,以便您知道您可能不小心这样做了。然后您可以仔细检查代码;如果您决定您的 Blobnicate 实现现在是多余的,您可以将其删除。如果它仍然很好,您可以将其标记为"new"并消除警告。

有道理吗?这是 C# 的微妙特征之一,使其适用于大型多版本面向组件 软件。

关于c# - 在与基类成员同名的派生类成员中使用 new 关键字的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8229171/

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