轉載原地址 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。