天天看点

面向对象特性(23)-- 密封(sealed)

作者:chencalf

0、参考

(1)讲的较好:https://blog.csdn.net/XVJINHUA954/article/details/106876099

(2)官方地址:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/sealed

以下C#语言讲解,描述(以后有空讲一下java)

1、功能和特点

1.1功能

sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写

1.2特点

  • (1)sealed修饰符不能和 abstract 同时使用,因为抽象类必须由提供抽象方法或属性的实现的类来继承,密封类不能同时又是抽象类,因为抽象总是希望被继承的。当然sealed也不能修饰接口(interface)
  • (2)sealed修饰符应用于方法或属性时,(密封)sealed修饰符必须始终与(重写)override结合使用(这是指对virtual的重写)
  • (3)sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员。

1.3作用

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

2、Sealed测试例子

2.1密封类的测试例子

注意:类密封后,整个类不能再继承了

(1)基本用法

public sealed class XXX
{
//..............................
}           

(2)简单例子

class a { }
sealed class b : a { }
//下面语句报错,无法从一个密封类继承
class c : b { }           

报错原因

面向对象特性(23)-- 密封(sealed)

2.2密封方法

注意:对方法密封后,无法重写。正确用法:只能对virtual方法的重新使用sealed,也就是只能是:sealed override XXX()

对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法

  • 不是类的每个成员方法都可以作为密封方法,要作为密封方法必须对父类的虚拟方法进行重写,提供具体的实现方法。
  • 所以,在方法的声明中,sealed 修饰符总是和override 修饰符同时使用。

(1)测试例子,不可以直接对方法密封,会报错,如下所示

public class demoA
{
   //直接这么用会出错!!!
    public sealed void Run()
    {
        Console.WriteLine("--run---");
    }
}           

报错如下

面向对象特性(23)-- 密封(sealed)

(2)正确用法:可以通过对虚函数的重新进行密封,如下所示

1)下面是正确的方法

public  class demoA
{
    public virtual void Run()
    {
        Console.WriteLine("-run--");
    }
}
public class demoB:demoA
{
    //正确使用,密封后,无法再重写
    public sealed override void Run()
    {
        Console.WriteLine("-run sealed--");
    }
}
class MasterClass
{
     public static void Main()
    {
        demoA demo = new demoB();
        demo.Run();
    }
}           

2)密封后无法继承,否则出错

public  class demoA
{
    public virtual void Run()
    {
        Console.WriteLine("-run--");
    }
}
public class demoB:demoA
{
    //正确使用,密封后,无法再重写
    public sealed override void Run()
    {
        Console.WriteLine("-run sealed--");
    }
}

public class demoC : demoB
{
    //因为demoB中该方法已经密封,无法继承
    public  override void Run()
    {
        Console.WriteLine("-run sealedCC--");
    }
}           

出错信息如下

面向对象特性(23)-- 密封(sealed)