首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 建構函式繼承機制深度解析:基底呼叫順序、欄位初始化與存取修飾詞

     編輯:關於C語言

建構函式鏈結規則

衍生類別建構函式必須呼叫基底類別建構函式:

  • 無參數列 → 隱式呼叫基底無參數建構函式。
  • 有參數列(base(...)) → 呼叫對應基底建構函式。

範例 1:參數傳遞與輸出順序


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

執行順序總結

  1. 衍生類別欄位初始化運算式(x = 1)
  2. 基底類別建構函式(此處呼叫 Print(),y 尚為預設值 0)
  3. 衍生類別建構函式本體(y = -1,再次呼叫 Print())

結論:欄位初始化優先權最高,早於任何建構函式本體。

建構函式存取修飾詞

私有建構函式防實例化範例


public sealed class Utility {
    private Utility() { } // 阻止外部 new Utility()
    public static int Add(int a, int b) => a + b;
}

編譯器不會為含私有建構函式的類別產生預設公用建構函式,達到防實例化目的。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
修飾詞可見性典型用途
public所有程式碼一般實例化
protected衍生類別基底類別僅供繼承,不直接實例化
internal同一組件組件內部工廠模式
private類別內部Singleton、靜態工廠方法、純靜態類別防實例化