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


1.實例化父類時,可以通過new子類來實例化父類,執行構造函數的順序為:先執行父類的構造函數,再執行子類的構造函數。

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

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

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

復制代碼
1 public class A
2     {
3         public A(string a) { }
4     }
5     public class B:A
6     {
7         public B() { }
8     }
復制代碼

這段代碼會有一個錯誤提示:

Severity Code Description Project File Line Suppression State
Error CS7036 There is no argument given that corresponds to the required formal parameter 'a' of 'Program.A.A(string)' practise1 c:\users\xuric\documents\visual studio 2015\Projects\practise1\practise1\Program.cs 21 Active

給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