天天看點

面向對象特性(23)-- 密封(sealed)

作者:chencalf

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 { }           

報錯原因

面向對象特性(23)-- 密封(sealed)

2.2密封方法

注意:對方法密封後,無法重寫。正确用法:隻能對virtual方法的重新使用sealed,也就是隻能是:sealed override XXX()

對方法可以使用sealed 修飾符,這時我們稱該方法是一個密封方法

  • 不是類的每個成員方法都可以作為密封方法,要作為密封方法必須對父類的虛拟方法進行重寫,提供具體的實作方法。
  • 是以,在方法的聲明中,sealed 修飾符總是和override 修飾符同時使用。

(1)測試例子,不可以直接對方法密封,會報錯,如下所示

public class demoA
{
   //直接這麼用會出錯!!!
    public sealed void Run()
    {
        Console.WriteLine("--run---");
    }
}           

報錯如下

面向對象特性(23)-- 密封(sealed)

(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--");
    }
}           

出錯資訊如下

面向對象特性(23)-- 密封(sealed)