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

Jam*_*s L 20 c#

我从版本1开始就一直在使用c#,并且从未见过使用成员隐藏的有价值的用法.你知道吗?

Eri*_*ert 15

场景#1:

想象一下,您正在为.NET 2.0设计运行时库.您现在可以使用泛型.你有一个界面:

interface IEnumerable 
{
    IEnumerator GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

您希望创建一个新界面

interface IEnumerable<T> 
{
    IEnumerator<T> GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

你现在有三个选择.

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

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

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

这些都是糟糕的选择.你会选哪个?我们选择了(3).这是一个选择的好事; 没有隐藏,该选项将无法使用.

现在,你可能会争辩说这个隐藏的例子并不"值得"; 如果是这样,你会做什么呢?

隐藏方法可以在类型系统有所改进时暴露改进的接口而不会导致破坏.

场景#2:

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

BlobCo忽视把一个Frobozzle()方法Blobber,但你的客户喜欢frobozzle frobbers,所以你添加一个方法Frobozzle()来派生类Frobber.

BlobCo意识到他们的客户想要Frobozzle blobbers,所以他们将基于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


Mar*_*ell 11

使返回类型更明确 - 例如SqlConnection.CreateCommand返回a SqlCommand,而不是a DbCommand.实际上,它似乎没有被宣布new,但这将是我使用它的少数几次之一; 大多数时候它是邪恶的.

另一个用途:从成员中删除继承的属性.


kem*_*002 5

我们有一个继承自WebControl类的类.当我们从3.5升级到4.0时,我们的一些属性(主要是onclick和javascript)的变化方式相当彻底.

我们无法改变AttributeCollection类的处理方式WebControl,因此我们所做的是AttributeCollection在我们的自定义集合中实现相同的方法和属性,并AttributeCollection使用我们自己的属性隐藏属性.

访问代码都没有改变,我们能够正确地实现如何处理类中的属性.现在没有人需要知道我们做了什么来解决这个问题.他们需要知道的是,他们称之为Attributes.Add正常,我们会把事情搞得一团糟.