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 { }
報錯原因
2.2密封方法
注意:對方法密封後,無法重寫。正确用法:隻能對virtual方法的重新使用sealed,也就是隻能是:sealed override XXX()
對方法可以使用sealed 修飾符,這時我們稱該方法是一個密封方法
- 不是類的每個成員方法都可以作為密封方法,要作為密封方法必須對父類的虛拟方法進行重寫,提供具體的實作方法。
- 是以,在方法的聲明中,sealed 修飾符總是和override 修飾符同時使用。
(1)測試例子,不可以直接對方法密封,會報錯,如下所示
public class demoA
{
//直接這麼用會出錯!!!
public sealed void Run()
{
Console.WriteLine("--run---");
}
}
報錯如下
(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--");
}
}
出錯資訊如下