1. 程式人生 > >c# 抽象類,抽象方法使用(abstract)

c# 抽象類,抽象方法使用(abstract)

  入行一年多,在這個IT行業,開發技術主要使用的是.NET,而對應使用的高階語言自然就是c#了。從2017年7月入職後,在平時的工作過程中,只記得使用一些方法去完成邏輯功能,而很少去深究一些語法特性,特別是沒有去關注為什麼會去使用這些語法。現在,入職一家新公司,那就從現在開始,一有空就做一些學習記錄,同時這也是一種分享,希望在園子裡可以和大家多多交流。

  平時在看專案程式碼的時候,經常看到Abstract這個關鍵字,但是我只是知道它該怎麼用,卻沒有去關心為什麼這麼用。著名哲學家黑格爾曾經說過,“存在即合理。”而我們今天就一起來探討一下Abstract(抽象)關鍵字的使用。

  在百度百科中,對於抽象類的解釋如下:

  在面向物件的概念中,所有的物件都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就是抽象類。

抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。

c#中的抽象類的特徵

抽象類具有以下特性:
  • 抽象類不能例項化。
  • 抽象類可以包含抽象方法和抽象訪問器。
  • 不能用 sealed 修飾符修飾抽象類,因為這兩個修飾符的含義是相反的。 採用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對類進行繼承。
  • 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現。

  那現在我們來實現它。首先,我們新建一個控制檯程式用來實現抽象方法。

 

 然後新建一個抽象類:DoWork,注意,當一個類中有抽象方法的時候,這個類必須定義為抽象類。

  

  我們在類中定義兩個抽象方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learen_AbstractFunc
{
   public abstract class DoWork
    {
        //定義一個抽象方法:奔跑
        public  abstract void DoRunnning();

        //定義一個抽象方法:睡覺
        public abstract void DoSleeping();

    }
}

  

  然後定義一個類來繼承這個抽象類,說明抽象類就是為了定義之後給別人繼承的,而如果繼承這個基類的派生類不想再抽象,就要去實現抽象類中的抽象方法。

  我們定義一個類,InheritDoWork.class 來繼承原先的類。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learen_AbstractFunc
{
    public class InheritDoWork : DoWork
    {
        public override void DoRunnning()
        {
            Console.WriteLine("實現了跑步的抽象方法");
            Console.ReadKey();
        }

        public override void DoSleeping()
        {
            Console.WriteLine("實現了睡覺的抽象方法");
            Console.ReadKey();
        }
    }
}

  

  最後,我們在主程式program中來測試它。測試程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learen_AbstractFunc
{
    class Program
    {
        static void Main(string[] args)
        {
            //例項化一個物件,因為抽象類無法被例項化
            InheritDoWork dowork = new InheritDoWork();
            Console.WriteLine("現在開始執行。。。");
            Console.ReadKey();
            Console.WriteLine("現在開始跑步");
            //呼叫已經實現的抽象方法
            dowork.DoRunnning();
            Console.WriteLine("現在開始睡覺");
            //呼叫已經實現的睡覺抽象方法
            dowork.DoSleeping();
        }
    }
}

  

  點選F5執行,執行結果如下。可以看到,我們在繼承了抽象類後並且去實現了它。

  

 

  總結:看到這裡你難免會覺得這樣的想法真是多此一舉,因為我們可以直接定義一個類就可以去實現它,但是如果有很多個類都要實現同樣的方法呢?那麼我們還哦要在每一個類中都定義一次這樣類似的方法?這樣顯然不太合適,因此,我們使用抽象類就是為了一次定義,然後允許別的類來繼承它,這樣每一個類只需要去實現自己想要的功能,而不用每一次都要去定義一次。