衍生類別建構函式必須呼叫基底類別建構函式:
base(...)) → 呼叫對應基底建構函式。
using System;
public class MyClass1 {
public MyClass1() { Console.WriteLine("MyClass1 Parameterless Constructor!"); }
public MyClass1(string p) { Console.WriteLine("MyClass1 Constructor Param: " + p); }
}
public class MyClass2 : MyClass1 {
public MyClass2(string p) : base(p) {
Console.WriteLine("MyClass2 Constructor Param: " + p);
}
}
public class Test {
public static void Main() {
new MyClass2("Hello");
}
}
MyClass1 Constructor Param: Hello
MyClass2 Constructor Param: Hello
基底建構函式先於衍生建構函式本體執行。
using System;
public class MyClass1 {
public MyClass1() { Print(); }
public virtual void Print() { }
}
public class MyClass2 : MyClass1 {
int x = 1; // 欄位初始化運算式
int y;
public MyClass2() {
y = -1; // 建構函式本體賦值
Print();
}
public override void Print() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
public class Test {
static void Main() { new MyClass2(); }
}
x = 1, y = 0
x = 1, y = -1
x = 1)Print(),y 尚為預設值 0)y = -1,再次呼叫 Print())結論:欄位初始化優先權最高,早於任何建構函式本體。
| 修飾詞 | 可見性 | 典型用途 |
|---|---|---|
public | 所有程式碼 | 一般實例化 |
protected | 衍生類別 | 基底類別僅供繼承,不直接實例化 |
internal | 同一組件 | 組件內部工廠模式 |
private | 類別內部 | Singleton、靜態工廠方法、純靜態類別防實例化 |