【发布时间】:2011-01-25 05:20:51
【问题描述】:
看了this问题的答案后想到了这个问题;这基本上表明List<T> 没有虚拟方法,因为它被设计为“快速,不可扩展”。
如果这是设计目标,为什么最初的设计没有包括密封类? (我知道现在这是不可能的,看看这会如何破坏客户端代码中的很多子类)
【问题讨论】:
-
我猜这是 .NET 中(很多?)糟糕的设计决策之一?
-
继承
List<T>来创建专门的集合并添加辅助方法(例如List<Crayon>.Count(Color))仍然有用,但@987654325 可能是个好主意@ 一些方法(Add等)。此外,虽然 .Net 有一些怪癖,但总的来说它是一个一致的框架。此外 - 你不能对所有使用非虚拟方法的非密封类提出相同的问题吗? -
我不会把它称为一个糟糕的设计决策——更像是一个非决策。从来没有人说过“嘿,让我们封印这个班级”,所以事实并非如此。有没有害处?
-
@Gabe:嗯,考虑到我使用过的各种企业级代码库,将其密封肯定会让我的生活更轻松......
-
@Kobi:就我个人而言,我会将此类辅助方法放在静态类上,并使其成为针对
IList<T>、ICollection<T>或IEnumerable<T>的扩展方法。无需派生,然后您可以将此类方法应用于适当元素类型的 any 列表/集合/可枚举,而不仅仅是辅助类的实例。这样的类通常会散发出糟糕设计的味道。
标签: c# .net language-design sealed