23

看完这个问题的答案后想到了这个问题;这基本上表明List<T>没有虚拟方法,因为它被设计为“快速,不可扩展”。

如果这是设计目标,为什么最初的设计没有包括密封类?(我知道现在不可能,看看这会如何破坏客户端代码中的很多子类)

4

2 回答 2

15

没有令人信服的理由来密封它。从中获得它并没有害处。我曾经有相反的心态——只留下你打算让人们从中获得的东西。但事后看来,这没有任何意义。.NET 的立场是,默认情况下方法是非虚拟的,但默认情况下类是未密封的。List<T>只是遵循同样的做法。

您想要密封一个类的地方是它确实覆盖了虚拟方法,但进一步的子类化并不容易或显而易见。从集合派生可能会稍微有用,例如Dictionary<TKey,TValue>在应用程序中使用已知类型参数并避免将它们输入。例如,您可能会有一个派生自 QueryString 的类Dictionary<String,String>

而且由于没有虚拟方法,因此实际上没有什么可以通过密封来保护类。

于 2011-01-25T05:33:56.460 回答
2

他们决定不做密封肯定有很多原因List<T>,但是,一种可能是框架设计团队希望与ArrayList(不是密封的)对等,以便现有的程序和基于扩展设计的框架ArrayList能够更容易地升级他们的设计来使用List<T>。对于这些用途来说List<T>,密封将是一个真正的死胡同,而强有力的指导设计选择之一就是允许人们轻松地将他们现有的代码库ArrayListList<T>.

于 2011-01-25T07:45:17.037 回答