【问题标题】:Static and Sealed class differences静态和密封类差异
【发布时间】:2013-04-19 11:58:24
【问题描述】:
  1. 有没有在静态类中实现的类?意思是:

    static class ABC : Anyclass
    
  2. 密封类和静态类都有可以继承的类吗?
    意思是:

    static class ABC : AClass {}
    

    sealed class ABC : AClass {}
    

我可能在某种程度上错了吗?

【问题讨论】:

  • staticsealed 真的没有任何关系
  • 但是@ken2k,静态类在 C# 中默认是密封的。不是吗?静态类根本不参与继承。

标签: c# .net oop static sealed


【解决方案1】:

这可能会对您有所帮助:

+--------------+---+-------------------------+------------------+---------------------+
|  Class Type  |   | Can inherit from others | Can be inherited | Can be instantiated | 
|--------------|---|-------------------------+------------------+---------------------+
| normal       | : |          YES            |        YES       |         YES         |
| abstract     | : |          YES            |        YES       |         NO          |
| sealed       | : |          YES            |        NO        |         YES         |
| static       | : |          NO             |        NO        |         NO          |
+--------------+---+-------------------------+------------------+---------------------+

【讨论】:

  • 太棒了。感谢@HosseinNarimaniRad 的及时回复。我早上就给你投票了,因为信息无论如何都是正确的,但这只是一个格式问题。顺便说一句,你的答案应该是从发布的那一刻起就被接受的答案,但似乎我们将不得不等待更多:)
  • 在此基础上考虑其他类型很有趣。像一些root class 可以被继承和实例化,但不能继承。不知道为什么会有用,但仍然
  • static class Foo : object { } 有效,但本质上是static class Foo { }
【解决方案2】:

简单来说

静态类

一个类可以声明为静态的,表示它只包含 静态成员。无法创建静态实例 类使用 new 关键字。静态类会自动加载 由 .NET Framework 公共语言运行时 (CLR) 当程序 或包含该类的命名空间已加载。

密封类

密封类不能用作基类。密封类是 主要用于防止衍生。因为它们永远无法使用 作为基类,一些运行时优化可以使调用密封 班级成员稍微快一点。

【讨论】:

    【解决方案3】:

    你可以让一个sealed类继承自另一个类,但你不能一个sealed类继承:

    sealed class MySealedClass : BaseClass // is ok
    class MyOtherClass : MySealedClass     // won't compile
    

    static 类不能从其他类继承。

    【讨论】:

      【解决方案4】:

      您可以简单地将它们区分为:

             Sealed Class       |        Static Class
      --------------------------|-------------------------
      it can inherit From other | it cannot inherit From other
      classes but cannot be     | classes as well as cannot be
      inherited                 | inherited
      

      【讨论】:

        【解决方案5】:

        简单的回答是密封类不能用作基类

        我试图告诉你密封类是下面代码中的派生类

         public sealed class SealedClass : ClassBase
        {
            public override void Print()
            {
                base.Print();
            }
        }
        

        另一个密封特性只能通过它的实例访问。(你不能从它继承)

         class Program
        {
            static void Main(string[] args)
            {
                SealedClass objSeald = new SealedClass();
                objSeald.Name = "Blah blah balh";
                objSeald.Print();
        
            }
        }
        

        【讨论】:

          【解决方案6】:

          1 - 不,您不能实现静态类。

          2 - 不,您不能从静态或密封类继承

          【讨论】:

          • 也许你可以添加一点解释。
          猜你喜欢
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 2012-04-19
          • 1970-01-01
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          • 2015-08-07
          相关资源
          最近更新 更多