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
- 只有抽象類中才允許抽象方法聲明。
- 由於抽象方法聲明不提供實際的實現,因此沒有方法主體;方法聲明僅以分號結尾,且簽名後沒有大括號。
- 在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。
- 無法使用 sealed 修飾符來修改抽象類,因爲兩個修飾符具有相反的含義。 sealed 修飾符阻止類被繼承,而 abstract 修飾符要求類被繼承。
- 派生自抽象類的非抽象類,必須包含全部已繼承的抽象方法和訪問器的實際實現。