C# 中的sealed修饰符学习
转载原地址 http://developer.51cto.com/art/200908/147327.htm
C#语言还是比较常见的东西,这里我们主要介绍C# sealed修饰符,包括介绍两个修饰符在含义上互相排斥用于方法和属性等方面。
C# sealed修饰符是干什么的?
C# sealed修饰符表示密封用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥用于方法和属性时,表示该方法或属性不能再被重写,必须和 override 关键字一起使用,因为使用 C# sealed修饰符的方法或属性肯定是基类中相应的虚成员通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱恰当的利用 C# sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员。
示例:
using System; 2.using System.Collections.Generic; 3.using System.Text; 4. 5.namespace Example06 6.{ 7.class Program 8.{ 9.class A 10.{ 11.public virtual void F() 12.{ 13.Console.WriteLine("A.F"); 14.} 15.public virtual void G() 16.{ 17.Console.WriteLine("A.G"); 18.} 19.} 20.class B : A 21.{ 22.public sealed override void F() 23.{ 24.Console.WriteLine("B.F"); 25.} 26.public override void G() 27.{ 28.Console.WriteLine("B.G"); 29.} 30.} 31.class C : B 32.{ 33.public override void G() 34.{ 35.Console.WriteLine("C.G"); 36.} 37.} 38.static void Main(string[] args) 39.{ 40.new A().F(); 41.new A().G(); 42.new B().F(); 43.new B().G(); 44.new C().F(); 45.new C().G(); 46. 47.Console.ReadLine(); 48.} 49.} 50.}
转载原地址 http://www.cnblogs.com/iamdaiyuan/archive/2007/02/06/642442.html
sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写。
sealed关键字的作用:
在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。
sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
密封类:
密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
在哪些场合下使用密封类呢?实际上,密封类中不可能有派生类。如果密封类实例中存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual 不再生效。
让我们看下面的例子:
1 abstract class AbstractClass 2 { 3 public abstract void Method( ) ; 4 } 5 sealed class SealedClass: AbstractClass 6 { 7 public override void Method( ) 8 { //... } 9 }
如果我们尝试写下面的代码
class OtherClass: SealedClass { }
C#会指出这个错误,告诉你SealedClass 是一个密封类,不能试图从SealedClass 中派生任何类。
密封方法:
C#还提出了密封方法(sealed method) 的概念,以防止在方法所在类的派生类中对该方法的重载。对方法可以使用sealed 修饰符,这时我们称该方法是一个密封方法。
不是类的每个成员方法都可以作为密封方法密封方法,要作为密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed 修饰符总是和override 修饰符同时使用。请看下面的例子代码:
1 using System ; 2 class A 3 { 4 public virtual void F( ) 5 { Console.WriteLine("A.F") ; } 6 public virtual void G( ) 7 { Console.WriteLine("A.G") ; } 8 } 9 class B: A 10 { 11 sealed override public void F( ) 12 { Console.WriteLine("B.F") ; } 13 override public void G( ) 14 { Console.WriteLine("B.G") ; } 15 } 16 class C: B 17 { 18 override public void G( ) 19 { Console.WriteLine("C.G") ; } 20 }
类B 对基类A 中的两个虚方法均进行了重载,其中F 方法使用了sealed 修饰符,成为一个密封方法。G 方法不是密封方法,所以在B 的派生类C 中,可以重载方法G,但不能重载方法F。