設計模式聊通透(2_1)接口和抽象類,如何選擇

什麼是抽象類(Abstract)

抽象類就是聲明爲抽象的類,具有以下特點。

  • 不能實例化,即不能new一個對象出來;
  • 可以被繼承;
  • 可以包含抽象方法,也可以沒有抽象方法(抽象方法是使用Abstract聲明,但是沒有實現);
  • 可以有靜態字段和靜態方法;
  • 非抽象子類必須實現所繼承的抽象類的所有抽象方法;
    下面是抽象類的示例。
    abstract class SampleAbstract
    {
        public static string CommonInfo = "commoninfo";
        private string privateInfo = "private Info";   
        
        public string Name { get; set; } = "";

        public void ShowPrivateInfo()
        {
            Console.WriteLine(privateInfo);
        }

        public abstract void Method1();
    }

什麼是接口

  本節主要摘自:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/
  接口定義了一個規定(contract,又稱爲合同等),任何類或者結構(struct)要實現這個接口,那麼必須實現接口中的規定。
  從C#8.0開始,接口可以定義默認實現。
  爲了描述本質信息,以下的說明都是基於C#8以下的版本。
  接口具有以下特點。

  • 具有方法、屬性、索引器、事件等成員(默認爲public,因此不用修飾符);
  • 接口可以繼承自一個類或者若干個接口(類必須排在第一位);
  • 繼承了接口的類或者結構必須實現接口的成員。
  • 接口無法直接進行實例化。

  下面看個例子。

    public interface ISampleInterface
    {
        void TeSampleMethods();
    }

    class ImplementationClass:ISampleInterface
    {
        public void TeSampleMethods()
        {
            Console.WriteLine("I am Implementation.");
        }
    }

  有兩種使用方法。

        static void Main(string[] args)
        {
            ISampleInterface obj1 = new ImplementationClass();
            obj1.TeSampleMethods();
            ImplementationClass obj2 = new ImplementationClass();
            obj2.TeSampleMethods();
            Console.Read();
        }

  執行結果。
在這裏插入圖片描述

In the following example, class ImplementationClass must implement a method named SampleMethod that has no parameters and returns void.

For more information and examples, see Interfaces.

Example

接口和抽象類的異同點

  參考自以下。
https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/

抽象類 接口
包含聲明和定義(實現) 僅包含聲明
不能進行多繼承(一個類最多隻能繼承自一個抽象類) 能進行多個繼承
包含構造器(構造函數) 不能包含構造函數
可以包含靜態成員 不能包含靜態成員
可以包含各種修飾符,如public、private、protected等 只包含public類型,因爲接口中的任何成員都是public
抽象類運行較快 接口運行較慢,因爲需要時間搜索相應的類的實際方法
可以包含方法、常量、字段等 只能包含方法類型(方法、屬性等)
包含的方法可以全部實現、部分實現或者不實現(子類也是抽象類,則可以部分實現父類的抽象方法) 方法必須全部實現

如何選擇使用

  從上節的抽象類和接口異同,可以得到如下結論:

  • 如果需要實現多個類的內在共同特徵(通過常量、字段、非抽象方法等體現),使用抽象類;如果主要體現實現類的外部功能(共同的方法),使用接口;

其它參考資料

https://dzone.com/articles/when-to-use-abstract-class-and-intreface

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