【公告】網站目前停止所有的課程訂閱服務,原有學員權益不受影響,造成不便還請見諒,我們正在打造更多課程以及圖書,包含 Python 為主的課程主題,未來將會合併且擴充目前的課程內容,提供全新課程訂閱服務,感謝學員的支持。

繼承架構的取存限制

我們可以利用修飾詞 protected 限制只有具備繼承關係的衍生類別才能對類別成員進行存取,如果類別成員限定只有繼承的類別才能作存取,宣告為 protected 是最合適的選擇。

class Program
{
    static void Main(string[] args)
    {
        Somemsg somemsg = new Somemsg();
        somemsg.ShowMessageA();
        somemsg.ShowMessageB();
        Console.ReadKey();
    }
}
class Somemsg
{
    private string messagea = "Hello KANGTING";
    private string messageb = "Welcom KANGTING";

    public void ShowMessageA()
    {
        Console.WriteLine(messagea);
    }
    protected void ShowMessageB()
    {
        Console.WriteLine(messageb);
    }
}

類別Somemsg中,有一個public方法ShowMessageA(),這個方法沒有任何限制可以由外部的程式碼存取,而第二組方法ShowMessageB(),宣告為protected,因此只有此Somemsg的衍生類別可以存取。
嘗試在類別Program的main()方法中,建立Somemsg物件,同時引用ShowMessageA()與ShowMessageB(),並且執行程式,會出現以下的錯誤訊息。

CS0122 'Somemsg.ShowMessageB()' 由於其保護層級之故,所以無法存取。

因為protected修飾詞的限制,因此導致ShowMessageB()無法被引用,現在建立另外一個類別,繼承Somemsg。

class WMessage : Somemsg
{
    public void ShowMessageW()
    {
        ShowMessageB();
    }
}

因為具有繼承關係,因此可以引用Somemsg類別中protected成員,定義ShowMessageW()方法,於其中引用ShowMessage()方法,接下來我們就可以利用WMessage這個類別間接完成ShowMessage()方法的引用。

重新調整Main()內容如下:

class Program
{
    static void Main(string[] args)
    {
        Somemsg somemsg = new Somemsg();
        somemsg.ShowMessageA();
        //somemsg.ShowMessageB();
        WMessage wMessage = new WMessage();
        wMessage.ShowMessageW();
        Console.ReadKey();
    }
}

這一次建立WMessage物件wMessage,並且透過此物件引用其中的ShowMessageW()方法,間接執行Somemsg類別中的protected()方法,因此我們可以得到以下的輸出結果:

Hello KANGTING
Welcom KANGTING

限制繼承(sealed Class)

當你想要限制類別被繼承,可以利用關鍵字 sealed 宣告一個密封類別,如此一來這個類別將無法被繼承,它代表整個繼承架構裏的終點。考慮以下的程式碼,其中宣告一個限制繼承的類別 SClass :

public sealed class SClass
{
       //

如果嘗試建立一個繼承此類別的新類別,如下的程式碼將無法通過編譯程序。

public class MyClass : SClass
{
        //

這會輸出以下的錯誤訊息

CS0509 'MyClass': 無法衍生自密封類型 'SClass' InheritanceProtected





沒有留言: