【问题标题】:Why are static classes sealed?为什么静态类是密封的?
【发布时间】:2014-12-27 06:53:51
【问题描述】:

我了解什么是静态类和密封类,并且我经常使用扩展方法,我只是想知道——有人知道为什么静态类在 C# 中是密封的吗?

我查看了 MSDN 和 C# 语言规范,但它从未真正说明为什么它们是密封的。

为什么我们不能从静态类继承和覆盖静态成员等?

编辑:

感谢您的回答,但您仍在谈论什么是静态类。我知道为什么我不能覆盖它的方法。但我问他们为什么会这样?

vtables 真的那么贵吗?为什么要设计一种语言,使静态类实际上是静态的?只是为了传统吗?还有其他我没有看到的优势吗?

(我偷偷怀疑我从根本上误解了静态类的意义。)

【问题讨论】:

  • 你不能覆盖任何静态成员,即使类不是静态的;你只能隐藏它们...为什么不使用像单例这样的设计模式来替代成员(因为它是静态实例,而不是类)或其他设计模式?
  • @BrianMains 这不是单例,而是零例。从来没有任何实例,而不是完全一个。
  • @Servy 我相信 Brian 建议 OP 使用单例,而不是静态类。
  • 从静态类继承是没有意义的。没有实例;你不需要动态调度。您必须在编译时知道要调用哪个方法。
  • 这个Why static classes declared sealed 解释了原因......但你的问题似乎更多地是关于为什么不允许继承,所以不完全重复。

标签: c# oop types


【解决方案1】:

你不能继承静态类,因为你不能覆盖静态成员。您不能覆盖静态成员,因为覆盖成员的整个概念依赖于隐式参数类型上的虚拟调度,而静态成员没有可调度的隐式参数。

【讨论】:

  • 您能详细说明一下“虚拟调度”吗?我可以用谷歌搜索而不会显得无知而只是想知道。
  • @RadioSpace 这是一个相当复杂的主题。如果您想了解更多信息,只需 google 一下。这远远超出了 SO 答案的范围。
  • 对我来说已经足够好了。谢谢。无论如何,我主要浏览谷歌的术语。
  • 是的,我同意这是字面上的答案。但是,我要问一个更广泛的问题——你知道他们为什么这样做吗?为什么不在静态类中包含 vtables?我缺少一些优势吗?
  • @SamPorch 您希望他们on 发送什么?实例方法使用其隐式参数的类型作为该查找表中的键。静态方法没有这样的参数,那么您希望它们用作键吗?
【解决方案2】:

密封类意味着您不能将其用作超类。创建一个类static 使它们无法用作基类,因为它们不能具有可覆盖的方法。因此,从静态类派生的价值值得怀疑:有人可能会争辩说,您可以从静态基类共享受保护的方法,但这是一条“单行道”,因为派生类无法通过提供有用的覆盖来改变其基类的功能.

这将静态类的实用性归结为类似名称空间的方法及其相关静态数据的持有者。让这些类继承其他静态类会使这个目的变得不那么清晰,而在功能或便利性方面增加的很少。

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2010-11-19
    • 2010-12-18
    • 2013-04-19
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多