c# - c#中new关键字隐藏成员的有效应用

标签 c#

我从第 1 版开始就一直在使用 c#,但从未见过成员隐藏的有值(value)用途。你知道吗?

最佳答案

场景#1:

假设您正在为 .NET 2.0 设计运行时库。您现在可以随意使用泛型。你有一个界面:

interface IEnumerable 
{
    IEnumerator GetEnumerator();
}

你想做一个新的界面

interface IEnumerable<T> 
{
    IEnumerator<T> GetEnumerator();
}

您现在有三个选择。

1) 使通用版本与非通用版本无关。

2) 使通用版本扩展非通用版本。您现在有两个方法,仅在返回类型上有所不同。将新类型中的 GetEnumerator 的名称更改为 GetEnumerator2()。因为那很热。每个人都喜欢好的“2”方法。

3) 使通用版本扩展非通用版本。使新的和改进的方法隐藏现有方法,以便在您需要时使用,但默认情况下隐藏。

这些都是错误的选择。你会选择哪个?我们选择了(3)。幸好这是一个选择;如果不隐藏,该选项将不可用。

现在,您可能会争辩说这个隐藏的特殊例子“不值得”;如果是这样,您会怎么做?

方法隐藏使得公开改进的接口(interface)成为可能,而不会在类型系统有改进时造成破坏。

场景#2:

你在 FrobCo 工作。您生成了一个扩展 Blobber 的类 Frobber,它由 BlobCo 的优秀人员提供给您。

BlobCo 忽略了在 Blobber 上放置 Frobozzle() 方法,但您的客户喜欢 frobozzle frobbers,因此您将 Frobozzle() 方法添加到派生类 Frobber。

BlobCo 意识到他们的客户想要 Frobozzle blobber,因此他们向基类 Blobber 添加了一个非虚拟方法 Frobozzle()。

现在你做什么,FrobCo 员工?

1) 删除 Frobber 上的 Frobozzle 方法,从而打破依赖您实现的客户。请记住,BlobCo 不知道如何对 Frobber 进行 Frobozzle;他们只编写了知道如何冷冻 Blobber 的代码。

2) 向 BlobCo 提示说他们应该让他们的方法成为虚拟的。希望有一天他们能为此做点什么。

3) 在派生类中隐藏它们的方法。

方法隐藏有助于缓解脆弱的基类问题。

进一步阅读:

http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx

关于c# - c#中new关键字隐藏成员的有效应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784423/

相关文章:

c# - 为什么 Int32.TryParse 在无法转换时重置 out 参数?

c# - 在带有身份验证的 MonoTouch 中使用 WCF 服务

c# - 基于分组的WCF服务响应设计c#

c# - 使用 LINQ 插入数据库

c# - Async TaskCompletionSource 调用方法两次

c# - 如何从用户控件窗口访问父窗口的控件

c# - 如何在 ASP.NET 中使用 Web 应用程序实现两阶段提交?

c# - CheckBox.DataBindings.Add 不起作用

C# Regex.Replace 匹配相同数量的字符

c# - 在网站中发送/接收/响应 IM 的最简单方法