【问题标题】:Should I seal all classes I know shouldn't ever be used as a base class?我应该密封所有我知道不应该用作基类的类吗?
【发布时间】:2010-01-29 18:22:18
【问题描述】:

我是否应该密封所有我知道不应该用作基类的类,即使没有明显的性能或安全问题,或者这只是增加了麻烦?

【问题讨论】:

标签: c# coding-style class sealed


【解决方案1】:

可扩展的类实现了它可以扩展的特性——该特性与该类的任何其他特性一样,应该被视为一个特性,与方法没有区别。应仔细考虑所有功能,以确保它们满足使用该功能的客户的目标。需要设计、实施、审查安全问题、调试、记录和维护功能。

所有这些都需要付出努力,而努力通常需要花钱。你花谁的钱?他们可能对您是否应该使用此功能有意见。

基本上,您有三个选择:

1) 花钱做这个功能,这样您就可以确信它是正确、强大、安全并满足用户需求的。

2) 不执行上述任何操作,但仍要发布该功能,并希望发布具有未知安全风险的未经设计、快速实施、未经测试、未记录、未维护的功能不会伤害您、您的雇主或您的客户。

3) 封类。如果您发现 (1) 是正确的选择,请稍后打开它。

我说 (3) 物有所值。我总是密封我写的每一个不是为可扩展性而设计的类。

【讨论】:

  • 埃里克,这里有一个问题要问你。就像在重写方法之前必须声明一个“虚拟”方法一样,为什么 C# 不采用类似的方式来指示一个类可以被继承并默认密封它。只是好奇。
  • 我会买这个。你认为 C# 类应该默认密封吗?
  • @Daniel, @SolutionYogi:我希望我们这样做了。然而,我其实是少数;有很多人认为只有在有理由的情况下才应该封课。我不同意;我认为只有在有理由的情况下才应该解封类。
  • @Daniel:因为我觉得它很棒。 (如果您使用 RSS 阅读器阅读博客,那么您会得到未格式化的。)
  • @SunnyMilenov:他们指的我的博文是:blogs.msdn.com/b/ericlippert/archive/2004/01/22/61803.aspx。 Jeff Atwood 的博文被提及为:codinghorror.com/blog/2006/12/eric-lipperts-purple-crayon.html。我对 Jeff 的回复在这里:blogs.msdn.com/b/ericlippert/archive/2007/01/08/…。可悲的是,反应不再是紫色的 lucida。是不是很讽刺,你不觉得吗?
【解决方案2】:

将一个类设置为sealed 并不麻烦,因为这样做会在您的代码中设置一个严格的规则:这个类不能被继承。

只有在不必要且令人困惑的情况下,代码才会显得笨拙。

也就是说,一种思想流派(以及简单的经验法则)是您应该始终密封所有课程,因为在必要时很容易解封它们,但反之则不然。一些代码生成器会自动执行此操作。 (参见上面 Eric Lippert 的选项 #3。它基本上说的是同一件事。)

【讨论】:

【解决方案3】:

我根本不会认为它添加了垃圾。相反,你清楚地表达了你对课程的意图。

类应该被设计为继承或被密封。不幸的是,类在 C# 中默认情况下不是密封的,因此您必须自己包含关键字。就个人而言,我更喜欢一个关键字来显式地使类可用于继承,因为这将阻止人们将类用作基类,除非它被显式标记为这样。

【讨论】:

    【解决方案4】:

    是的。如果不出意外,这只是一个路标,让其他人知道他们不应该走得更远。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2012-07-22
      • 2012-07-17
      相关资源
      最近更新 更多