大家都知道,抽象類別是不可以執行個體化的,那麼在抽象類別中是否可以有建構函式呢?
很多初學者都有類似的疑問!
答案是肯定的,而且如果我們自己沒有定義的話,編譯器還會為我們產生一個預設的建構函式的,看這段代碼:
public abstract class MyAbstractClass
{
}
我們自己並沒有自己定義建構函式,我們用ILDasm工具來看看產生的IL代碼:
.method family hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代碼大小 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
}
// end of method MyAbstractClass::.ctor
大家應該注意到了,的確編譯器為我們產生了一個預設的建構函式!
為什麼這樣設計呢?
很容易理解,抽象類別是需要被其他類繼承的,這些子類是需要執行個體化的,執行個體化子類的時候是需要調用子類的建構函式的,而在預設情況下,在調用子類的建構函式前是先要調用基類的建構函式的,這一點和非抽象的類一樣!
實際上可以做如下測試:
代碼
class Program
{
static void Main(string[] args)
{
MyEntityClass a = new MyEntityClass();
}
}
public abstract class MyAbstractClass
{
public MyAbstractClass()
{
Console.WriteLine("抽象類別的無參建構函式被調用!");
}
}
public class MyEntityClass : MyAbstractClass
{
}
運行結果是: 抽象類別的無參建構函式被調用!
構造過程是預設調用基類的無參建構函式的,這一點和非抽象的類一樣!