C#繼承與構造函數的調用


1、實例化父類時,可以使用new子類,執行構造函數順序為:先執行父類構造函數,再執行子類構造函數。

2、實例化子類時,只可以new子類,執行順序同上。

3、父類實例化后,只能執行父類的方法,獲得父類的屬性等。

4、實例化子類后,可同時執行子類和父類的方法和屬性,如同名方法,則執行子類的方法。

我們看以下的代碼:

    public class A
    {
        public A(string a) { }
    }
    public class B:A
    {
        public B() { }
    }

這段代碼編譯后,會有個錯誤提示:A does not contain a constructor that takes '0' arguments ,中文意思類A沒有包含無參構造函數。按照提示,添加了無參構造函數,問題解決了。

那么為什么會這樣呢,我們知道,子類在創建對象執行構造函數之前會先執行父類的構造函數,那么假如父類中有多個構造函數,又是執行哪個呢,這時候base這個關鍵字我想可以來說明一切。還是看代碼吧:

    public class A
    {
        public A() { }
        public A(string a) { }
    }
    public class B:A
    {
        public B():base()
        { }
    }

在A中添加了無參構造函數,然后在B中修改了這句:pubic B():base(){},然后我們測試下,創建一個B對象,在A類中的2個構造函數中設置斷點,發現無參構造函數執行了,我想正是因為這個base在這里發揮了作用,是base()指向了父類的無參構造函數。其實,在類B中,我們完全可以省略 base(),也能正常運行,

第一段代碼中提示的錯誤的原因是A類中沒有無參的構造函數,這樣在執行B中的構造函數的時候,就沒法執行A中的無參構造函數了。 下面我在寫一段不使用無參構造函數的代碼,看了會更加清晰:

    public class A
    {
        public A(string a)
        {
            //
        }
    }
    public class B:A
    {
        public B(string a):base(a)
        {
            //
        }
    }B中的構造函數指定了調用父類的A(string a)構造函數。這樣我們創建B對象在執行構造函數前就會執行父類中對應的指定的構造函數了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM