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