sealed在C#中的作用說(shuō)明
更新時(shí)間:2010年10月20日 18:55:37 作者:
sealed的中文意思是密封,故名思義,就是由它修飾的類或方法將不能被繼承或是重寫。
sealed關(guān)鍵字的作用:
在類聲明中使用sealed可防止其它類繼承此類;在方法聲明中使用sealed修飾符可防止擴(kuò)充類重寫此方法。
sealed修飾符主要用于防止非有意的派生,但是它還能促使某些運(yùn)行時(shí)優(yōu)化。具體說(shuō)來(lái),由于密封類永遠(yuǎn)不會(huì)有任何派生類,所以對(duì)密封類的實(shí)例的虛擬函數(shù)成員的調(diào)用可以轉(zhuǎn)換為非虛擬調(diào)用來(lái)處理。
密封類:
密封類在聲明中使用sealed 修飾符,這樣就可以防止該類被其它類繼承。如果試圖將一個(gè)密封類作為其它類的基類,C#將提示出錯(cuò)。理所當(dāng)然,密封類不能同時(shí)又是抽象類,因?yàn)槌橄罂偸窍M焕^承的。
在哪些場(chǎng)合下使用密封類呢?實(shí)際上,密封類中不可能有派生類。如果密封類實(shí)例中存在虛成員函數(shù),該成員函數(shù)可以轉(zhuǎn)化為非虛的,函數(shù)修飾符virtual 不再生效。
讓我們看下面的例子:
abstract class AbstractClass
{
public abstract void Method( ) ;
}
sealed class SealedClass: AbstractClass
{
public override void Method( )
{ //... }
}
如果我們嘗試寫下面的代碼
class OtherClass: SealedClass
{
}
C#會(huì)指出這個(gè)錯(cuò)誤,告訴你SealedClass 是一個(gè)密封類,不能試圖從SealedClass 中派生任何類。
密封方法:
C#還提出了密封方法(sealedmethod) 的概念,以防止在方法所在類的派生類中對(duì)該方法的重載。對(duì)方法可以使用sealed 修飾符,這時(shí)我們稱該方法是一個(gè)密封方法。
不是類的每個(gè)成員方法都可以作為密封方法密封方法,要作為密封方法必須對(duì)基類的虛方法進(jìn)行重載,提供具體的實(shí)現(xiàn)方法。所以,在方法的聲明中,sealed 修飾符總是和override 修飾符同時(shí)使用。請(qǐng)看下面的例子代碼:
using System ;
class A
{
public virtual 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 對(duì)基類A 中的兩個(gè)虛方法均進(jìn)行了重載,其中F 方法使用了sealed 修飾符,成為一個(gè)密封方法。G 方法不是密封方法,所以在B 的派生類C 中,可以重載方法G,但不能重載方法F
在類聲明中使用sealed可防止其它類繼承此類;在方法聲明中使用sealed修飾符可防止擴(kuò)充類重寫此方法。
sealed修飾符主要用于防止非有意的派生,但是它還能促使某些運(yùn)行時(shí)優(yōu)化。具體說(shuō)來(lái),由于密封類永遠(yuǎn)不會(huì)有任何派生類,所以對(duì)密封類的實(shí)例的虛擬函數(shù)成員的調(diào)用可以轉(zhuǎn)換為非虛擬調(diào)用來(lái)處理。
密封類:
密封類在聲明中使用sealed 修飾符,這樣就可以防止該類被其它類繼承。如果試圖將一個(gè)密封類作為其它類的基類,C#將提示出錯(cuò)。理所當(dāng)然,密封類不能同時(shí)又是抽象類,因?yàn)槌橄罂偸窍M焕^承的。
在哪些場(chǎng)合下使用密封類呢?實(shí)際上,密封類中不可能有派生類。如果密封類實(shí)例中存在虛成員函數(shù),該成員函數(shù)可以轉(zhuǎn)化為非虛的,函數(shù)修飾符virtual 不再生效。
讓我們看下面的例子:
復(fù)制代碼 代碼如下:
abstract class AbstractClass
{
public abstract void Method( ) ;
}
sealed class SealedClass: AbstractClass
{
public override void Method( )
{ //... }
}
如果我們嘗試寫下面的代碼
class OtherClass: SealedClass
{
}
C#會(huì)指出這個(gè)錯(cuò)誤,告訴你SealedClass 是一個(gè)密封類,不能試圖從SealedClass 中派生任何類。
密封方法:
C#還提出了密封方法(sealedmethod) 的概念,以防止在方法所在類的派生類中對(duì)該方法的重載。對(duì)方法可以使用sealed 修飾符,這時(shí)我們稱該方法是一個(gè)密封方法。
不是類的每個(gè)成員方法都可以作為密封方法密封方法,要作為密封方法必須對(duì)基類的虛方法進(jìn)行重載,提供具體的實(shí)現(xiàn)方法。所以,在方法的聲明中,sealed 修飾符總是和override 修飾符同時(shí)使用。請(qǐng)看下面的例子代碼:
復(fù)制代碼 代碼如下:
using System ;
class A
{
public virtual 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 對(duì)基類A 中的兩個(gè)虛方法均進(jìn)行了重載,其中F 方法使用了sealed 修飾符,成為一個(gè)密封方法。G 方法不是密封方法,所以在B 的派生類C 中,可以重載方法G,但不能重載方法F
您可能感興趣的文章:
相關(guān)文章
asp.net treeview checkbox 相關(guān)問(wèn)題
asp.net treeview checkbox 相關(guān)問(wèn)題,需要的朋友可以看下。2009-06-06.NET集成DeveloperSharp實(shí)現(xiàn)高效分頁(yè)與無(wú)主鍵分頁(yè)
DeveloperSharp系列近期又被制造業(yè)ERP、民航飛行App、建筑BIM、電力掌上營(yíng)業(yè)廳、等多家大型采用,站在巨人的肩膀上你能走的更遠(yuǎn),這篇文章主要介紹了.NET集成DeveloperSharp實(shí)現(xiàn)高效分頁(yè)與無(wú)主鍵分頁(yè),需要的朋友可以參考下2024-06-06詳細(xì)介紹.NET中的動(dòng)態(tài)編譯技術(shù)
這篇文章詳細(xì)介紹了.NET中的動(dòng)態(tài)編譯技術(shù),有需要的朋友可以參考一下2013-11-11DataGridView自動(dòng)調(diào)整行高和行寬
根據(jù)數(shù)據(jù)內(nèi)容自動(dòng)調(diào)整列寬,根據(jù)數(shù)據(jù)內(nèi)容自動(dòng)調(diào)整行高2009-04-04