1. 所有參數預設值會先被設定
class MyClass
{
int para1 = 1;...
}
因此在constructor被呼叫時,para1已經是1了
2. 最base的constructor被呼叫
3. 一層層往上呼叫
4. 最derived的最後被呼叫
5. 最後執行Object and collection initializer
(new myClass{para1 = 2; para2 = 3;...})初始會陣列就是用這個操作方式
參考資料,資料中對流程的描述更細緻,大致上是說其實是最子代的construcot先被呼叫,
但是在執行constructor的body({}中的東西)前回先跑chaining(:後面的東西)的部分
所有的class預設的constructor是
public thisClass():base()
{}
因此都會呼叫base的無參數construtor
如果base class沒有無參數的constructor(產生了其他有參數的constructor),就需要指定呼叫base constructor
例如
class BaseClass
{
public BaseClass(int x)
{}
}
這時候
class DerivedClass:BaseClass
{
}
的建構是若是空白就會產生找不到BaseClass()的錯誤
因此需要加入
public DerivedClass():BassClass(0)
{}
以呼叫正確的建構式
以下程式碼的結果是
>>>
init base,para Default Inited
init derived,Para default inited,para Default Inited
object and collection inited
以下程式碼的結果是
>>>
init base,para Default Inited
init derived,Para default inited,para Default Inited
object and collection inited
class Program
{
static void Main(string[] args)
{
var dc = new derivedClass() { para = "object and collection inited" };
}
}
class baseClass
{
public string basePara = ",para Default Inited";
public string para { set { WriteLine(value); } }
public baseClass()
{
WriteLine("init base"+basePara);
}
}
class derivedClass:baseClass
{
public string derivedPara = ",Para default inited";
public derivedClass()
{
WriteLine("init derived"+derivedPara+basePara);
}
}
沒有留言:
張貼留言