C#之密封(sealed)的用法

C#之密封(sealed)的用法

密封(sealed)

C# 密封(sealed)修饰符是干什么的?

  • sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写
  • C# sealed修饰符不能和 abstract 同时使用,因为抽象类必须由提供抽象方法或属性的实现的类来继承,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
  • C# sealed修饰符应用于方法或属性时,(密封)sealed修饰符必须始终与(重写)override结合使用。
  • C# sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员。

C# 密封(sealed)修饰符的作用是什么?

  • 在类声明中使用sealed可防止其它类继承此类;
  • 在方法声明中使用sealed修饰符可防止扩充类重写此方法。
  • sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。
  • 密封类中永远不可能有任何派生类。如果密封类实例中存在虚拟成员函数,该成员函数可以转化为非虚的,函数修饰符virtual 不再生效。

示例

使用该关键字能修饰类或者类中的方法,修饰的类被称为密封类、修饰的方法被称为密封方法。

密封类

  • 密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的父类,C#将提示出错。

请看下面的例子代码,类 b继承自类 a,但类c不可以继承自类 b,因为类b让密封了

class a {}
sealed class b : a {}
//class c : b { }//因为B让密封了,所以不能被继承

在这里插入图片描述

密封方法

  • C#还提出了密封方法(sealed method) 的概念,以防止在方法所在类的子类中对该方法的重写。
  • 对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法。
  • 不是类的每个成员方法都可以作为密封方法,要作为密封方法必须对父类的虚拟方法进行重写,提供具体的实现方法。
  • 所以,在方法的声明中,sealed 修饰符总是和override 修饰符同时使用。

请看下面的例子代码:

 class yilei
    {
        class A 
        { 
        public virtual void X()
            {
                Console.WriteLine("虚拟父类");
            }
            public virtual void Y()
            {
                Console.WriteLine("虚拟父类Pro");
            }
        }
        class B : A
        {
            public override void X()
            {
                Console.WriteLine("子类继承虚拟父类以后,对父类进行重写");
            }
            sealed public override void Y()
            {
                Console.WriteLine("子类继承虚拟父类Pro以后,对父类进行密封,重写");
            }
            class C : B
            {
                public override void X()
                {
                    Console.WriteLine("对没有密封的子类进行虫子额,成功");
                }
                //public override void Y()
                //在B类中Y方法重写时被密封了,
                //所以C类继承B类以后Y方法不可以重写
            }
        }
    }

在这里插入图片描述
其实在类中定义新方法或属性时,可以通过不将它们声明为虚拟,来防止派生类替代它们,和密封的作用一致

猜你喜欢

转载自blog.csdn.net/XVJINHUA954/article/details/106876099