|
|
1
15
情景1:假设您正在为.NET 2.0设计运行库。你现在可以随意使用仿制药了。您有一个接口:
您希望创建一个新的界面
你现在有三个选择。 1)使通用版本与非通用版本无关。 2)使通用版本扩展非通用版本。现在您有两个方法,它们只在返回类型上有所不同。将新类型中getEnumerator的名称更改为getEnumerator2()。因为那很热。每个人都喜欢一个好的“2”方法。 3)使通用版本扩展非通用版本。使新的和改进的方法隐藏现有方法,以便在需要时将其隐藏,但默认情况下隐藏。 这些都是错误的选择。你会选择哪一个?我们选择了(3)。很好,这是一个选择;如果不隐藏,这个选择将不可用。 现在,你可能会争辩说,这个隐藏的特殊例子是“不值得”的;如果是这样,你会怎么做呢? 方法隐藏使暴露改进的接口成为可能,而不会在改进类型系统时导致损坏。 情景2:你在佛罗布科工作。你产生了一个扩展了blobber的类blobber,它由blobco的好人提供给你。 blobco忽略了在blobber上放置frobozzle()方法,但是您的客户喜欢使用frobozzle(),因此您向派生类frober添加了一个方法frobozzle()。 Blobco意识到他们的客户想要冻结blobber,所以他们向blobber(基类)添加了一个非虚拟方法frobzzle()。 现在你怎么办,佛罗布科的员工? 1)删除frobeber上的frobozzle方法,从而破坏依赖于您的实现的客户。记住,blobco不知道如何使一个冒泡的人冒泡;他们只编写知道如何使一个冒泡的代码。 2)向Blobco抱怨他们应该将方法变为虚拟的。希望有一天他们能做点什么。 3)在派生类中隐藏它们的方法。 方法隐藏有助于减轻脆弱的基类问题。 进一步阅读:http://blogs.msdn.com/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx |
|
2
11
使返回类型更显式-例如
另一个用途:从成员中删除继承的属性。 |
|
|
3
5
我们有一个从WebControl类继承的类。当我们从3.5升级到4.0时,我们的一些属性(主要围绕onclick和javascript)发生了很大的变化。
我们无法改变
访问代码都没有改变,我们能够正确地实现如何处理类中的属性。现在没人需要知道我们做了什么来解决这个问题。他们只需要知道
|
|
|
4
2
当使用丰富的设计时经验制作控件时,通常需要隐藏现有属性以应用属性。 |
|
|
5
2
一般来说,拒绝继承成员被认为是不好的做法。我唯一一次使用它是在生成的代码中,新成员在同一类层次结构中提供了更具体的类型。显式接口实现也是如此。 |
|
|
6
1
有时,我会从基类库中的某个类派生一个类,其中的基类(出于性能原因)不使用虚拟函数。在这种情况下,使用“new”是有意义的。下面是一个例子(与MarcGravell所说的相匹配),一个强类型的weakreference:
在基类方法实际上是虚拟的情况下,我认为微软正在设想这样的情况:基类由一方实现,派生类由另一方实现。第二方添加了一个函数“foo”,然后第一方添加了另一个函数“foo”,它实际上做了一些不同的事情(因此覆盖并不合适)。然后,为了保持与第三方代码的兼容性,第二方保留了名为“foo”的函数,尽管它与基类版本没有直接关系。在这种情况下,第二方在其声明中添加了“新的”。 |
|
|
7
0
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |