sealed 将用于密封类或密封类的成员。

sealed 类

密封的类将不能被继承,也就是不能成为其他类的基类。

  • 不能与 abstract 共存(意思相反,abstract 是该类只能被继承,只能是其他类的基类)
  • 该类中的成员不能是 abstract 的,由于它是必须被继承类重写的。警告 CS0513:“密封类 . 方法”是抽象的,但它包含在非抽象类型“密封类”中。
  • 该类中的成员不能是 virtual 的,由于它是可以被继承类重写的。警告 CS0549:“密封类 . 方法”是密封类型“密封类”中新的虚拟成员。
  • 因为 sealed 类永远不能用作基类,所以一些运行时优化可以使调用密封类成员的速度稍微快一些。
  • 由于 struct 是隐式密封的,无法继承 struct。
sealed class LeiJi
    {

    }

class LeiP : LeiJi // 警告 CS0509:“LeiP”:无法从密封类型“LeiJi”派生
    {

    }

sealed 成员

当某个成员(方法、索引器、属性或事件)是被该类重写的基类成员时,可以声明为 sealed。若该类被派生,该类重写的 sealed 成员将不能被重写。

  • 仅限于与 override 共存(放在它前面),也就是只能密封重写的派生成员。
  • 若基类的成员未声明为 virtual 或 abstract(抽象类),派生类无法重写它们,也就无法密封它们
class LeiJi
    {
        public virtual void FF ( )
            {
                Console . WriteLine ( "Ji . FF" );
            }

        public void FFJi ( )
            {
            }
    }

class LeiP : LeiJi
    {
        public sealed override void FF ( )
            {
                base . FF ( );
                Console . WriteLine ( "P . FF" );
            }

        //public sealed void FFP ( ) // 警告 CS0238:因为“LeiP . FFP”不是重写,所以无法将其密封
        //    {
        //    }
    }

class LeiPs : LeiP
    {
        public void FFPs ( )
            {
                FF ( ); // 无法重写,但可以直接用……
            }

        //public override void FF ( ) // 警告 CS0239:“LeiPs . FF”:继承成员“LeiP . FF”是密封的,无法进行重写
        //    {
        //    }
    }

兔子码农
4 声望1 粉丝

一个酒晕子


« 上一篇
C# 的 ref