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對象在執行構造函數前就會執行父類中對應的指定的構造函數了。