55.C#構造函數難點:base和this

  • base表示先調用基類的構造函數,如果此構造函數體爲空,則實際只執行基類構造函數。
  • this表示先調用這個類的其它構造函數,如果此構造函數體爲空,則實際只執行其它構造函數。
  • 帶有private的構造函數不能在類外執行。
class MyClass1
{
    public readonly string Name;
    private int intVal;

    public int IntVal { get => intVal; set => intVal = value; }

    public override string ToString() => "Name:" + Name + "\nVal: " + IntVal;

    private MyClass1() : this("Default Name") { }//這一句如何解讀?
    public MyClass1(string newName)
    {
        Name = newName;
        intVal = 0;
    }

    private int myDoubleInt;
    public int myDoubleIntProp => (myDoubleInt * 2);
}
class MyClass2
{
    public readonly string Name;
    private int intVal;

    public int IntVal { get => intVal; set => intVal = value; }

    public override string ToString() => "Name:" + Name + "\nVal: " + IntVal;

    public MyClass2() : this("Default Name") { }//無參數類調用具體的帶參數類構造函數
    public MyClass2(string newName)
    {
        Name = newName;
        intVal = 0;
    }

    private int myDoubleInt;
    public int myDoubleIntProp => (myDoubleInt * 2);
}

class subMyClass:MyClass2
{
    public subMyClass():base()
    {
        Console.WriteLine("subMyClass():base()");
    }
    public subMyClass(string str):base(str)
    {
        Console.WriteLine("subMyClass(string str):base(str)");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass1 mc1 = new MyClass1("不能使用無參數構造函數");//因爲默認構造函數被定義爲private,無法在類外使用

        MyClass2 mc2 = new MyClass2();
        Console.WriteLine($"{mc2.IntVal},{mc2.Name}");
        subMyClass subcls1 = new subMyClass();
        subMyClass subcls2 = new subMyClass("good.");
    }
}

輸出結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章