[英]why doesn't my c# base constructor get called?
public class Animal
{
public Animal()
{
"animal ctor".Dump();
}
}
public class Cat :Animal
{
public Cat():this("gray")
{
"cat ctor".Dump();
}
public Cat(string c):base()
{
"cat ctor2".Dump();
}
}
void Main()
{
Cat a = new Cat();
}
代碼的輸出為:
animal ctor
cat ctor2
cat ctor
我了解第一行。
首先調用Animal Ctor,然后再調用Cat ctor調用字符串重載public Cat(string c):base()
-但這還調用了base的構造函數。
那么,為什么我再也看不到animal ctor
( :base()
)?
構造函數僅被調用一次:
Cat()
構造函數調用Cat(string c)
Cat(string c)
正在調用基本構造函數 Cat(string c)
被執行(是base的調用者) Cat()
構造函數 基本上,如果您調用基本構造函數(或類中的另一個構造函數),則在構造函數之前執行。有關更多詳細信息,請參見文檔
Cat()
顯式調用Cat(string)
,后者顯式調用Animal()
。
這些調用在每種方法開始之前發生,因此您會看到它們以相反的順序轉儲。
Cat()
不會直接調用Animal()
,這意味着基類的構造函數只會被調用一次(這可能是您想要的)
如果您未明確指定要調用的構造函數,則將調用基類的默認構造函數;否則,將返回默認類。 因此,以下內容:
public Cat(string c) :base()
{
"cat ctor2".Dump();
}
等效於:
public Cat(string c)
{
"cat ctor2".Dump();
}
有一些繼承和對象構造規則。
在這里,構造函數按以下順序調用:Cat():this(string),即Cat(string):base(),即Animal()
動物是貓的基礎,因此首先要構造動物。 一旦Animal()構造函數調用完成,則Cat(string)將完成,隨后Cat()調用將完成。
即使您不提及base(),base也將被調用。 默認情況下,始終會調用無參數構造函數(如果有的話),並且此過程會冒泡到層次結構中最頂層的父級。
對於每個類,始終存在無參數構造函數。 但是,如果用參數聲明一個,則顯式地需要聲明一個無參數的構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.