关键字Sealed

Posted ccssxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关键字Sealed相关的知识,希望对你有一定的参考价值。

sealed中文:密封,就是说有它修饰的类或者方法将不能被继承或者重写 
作用:在类声明中使用sealed可以防止其他类继承此类,在方法声明中使用sealed修饰符可以防止扩充类重写此方法。 
sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。换句话说,密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用处理。

实际应用:密封类中不可能有派生类,如果密封类实例中存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual不再生效。 
EX: 

1.  abstract class AbstractClass   
2.   {   
3.         public abstract void Method( ) ;   
4.   }   
5.     
6.   sealed class SealedClass: AbstractClass   
7.   {   
8.          public override void Method( )   
9.           { //... }   
10.  } 
从上面中可以看到,定义了一个抽象类AbstractClass  ,密封类一个SealedClass类,该类继承于AbstractClass  ,因为抽象类总是希望被继承,所以继承后子类可以对父类的方法进行重写(override修饰符) 


然而我们再写一个类: 
class OtherClas:SealedClass 


C#会报错  

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

例子: 
using system; 
class A 

     public vrtual void F() 

     console.writeLine("A.F"); 



public virtual void G() 

  console.writeLine("A.G"); 




class B:A 

sealed override public void F() 

console.writeLine("B.F"); 

override public void G() 

console.writeLine("B.G"); 






class C:B 

override public void G() 

     console.WriteLine("C.G"): 

运行玩程序可以发现,类B对基类A的两个虚方法进行了重载,其中F方法使用了sealed修饰符,成为了一个密封方法,而G不是密封方法,所以在B类的派生(子类)C中,可以重载方法G,但不能重载方法F.

 

以上是关于关键字Sealed的主要内容,如果未能解决你的问题,请参考以下文章

scala中的sealed

c#sealed 和 Java 的 final 关键字在功能上有啥区别吗? [复制]

kotlin sealed密封类

C#中的Sealed和J#中的Final比较(转载)

C# 密封类和密封方法

十密封类和密封方法