C#關鍵字掃盲——abstract 抽象

abstract

abstract
官方描述:abstract修飾符指示被修改內容的實現已丟失或不完整。 abstract 修飾符可用於類、方法、屬性、索引和事件。 在類聲明中使用 abstract 修飾符以指示某個類僅旨在作爲其他類的基類。 標記爲 abstract 的成員,或包含在抽象類中的成員,都必須由派生自抽象類的類來實現。


項目源碼地址:https://gitee.com/michel4liu/LearnCSharp.git
項目:LearnAbstract
環境VS2017 .NET Core2.0


特性1:抽象類中可以有抽象方法和已實現方法

abstract class Father  //定義abstract Father  
{
    public Father()
    {
        Console.WriteLine($"{nameof(Father)}.構造函數");
    }

    public void OnCall()
    {
        Console.WriteLine("OnCall...");
    }

    public abstract void DoSomething();
}

class Son : Father //繼承 abstract  Father 
{
    public override void DoSomething()
    {
        Console.WriteLine($"{nameof(Son)}.Learn");
    }
}

static void Main(string[] args)
{
    Son s = new Son();
    s.DoSomething();
    s.OnCall();

    Console.ReadKey();
}

//輸出內容如下
Father.構造函數
Son.Learn
OnCall...

輸出1(“Father.構造函數”)表示實例化時抽象類也會被執行構造函數同正常基類一樣。

抽象類必須爲繼承的所有接口成員提供實現,可直接實現或抽象實現

錯誤用法1: 抽象類無法對構造函數添加 abstract 修飾符

錯誤用法2: 繼承抽象類 必須實現所有抽象方法、屬性、索引和事件,也不能通過new修飾符修改唯一的實現方法。

補充上圖 如果已經有一個實現方法,可以寫同名重載無需加override,加了編譯器會報錯


注意點 抄自MSDN

  1. 只有抽象類中才允許抽象方法聲明。
  2. 由於抽象方法聲明不提供實際的實現,因此沒有方法主體;方法聲明僅以分號結尾,且簽名後沒有大括號。
  3. 在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。
  4. 無法使用 sealed 修飾符來修改抽象類,因爲兩個修飾符具有相反的含義。 sealed 修飾符阻止類被繼承,而 abstract 修飾符要求類被繼承。
  5. 派生自抽象類的非抽象類,必須包含全部已繼承的抽象方法和訪問器的實際實現。
發佈了40 篇原創文章 · 獲贊 29 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章