[譯]C#8.0中一個使接口更加靈活的新特性-默認接口實現

9月份的時候,微軟宣佈正式發佈C#8.0,做爲.NET Core 3.0發行版的一部分。C#8.0的新特性之一就是默認接口實現。在本文中,咱們將一塊兒來聊聊默認接口實現。
做者:依樂祝
原文連接:http://www.javashuo.com/article/p-ufrubfpw-dc.htmlhtml

提早說下:編程

  1. 這其實是一種基於特性的編程技術,能夠在幾個無關類之間進行方法的重用。不過的確有點反認知,畢竟接口方法不能進行實現,已經深刻骨髓了。
  2. 必定要區分抽象類及接口的適用場景,抽象類表述的對象,而接口表述的是行爲,以及規則哦
    固然大家也能夠接口有多個實現類的時候可使用抽象類來包一層。而不是直接使用抽象類來定義行爲哈。可能不少小夥伴直接使用抽象類來定義行爲了!

衆所周知,對現有應用程序的接口進行更改是一項很危險的操做。c#

若是這個接口又在多個項目中使用了,那麼進行更改將須要付出更多的精力,以確保它不會在其餘地方運行失敗。架構

若是該項目是一個小項目,那麼咱們能夠很容易地識別這些類,並在接口發生變化時進行相應的更改。可是,若是項目是大而複雜的,那麼很難識別全部受影響的項目的模塊和類。異步

咱們可能須要更多的資源和精力來識別和更改全部項目模塊和類。除此以外,咱們可能須要重建和交付全部使用該接口的項目。ide

爲了處理這種狀況,Microsoft團隊在C#8.0中引入了一個新特性--默認接口實現學習

C#8.0容許咱們爲接口中的方法指定默認實現。.net

下面讓咱們用一個例子來討論這個問題。假設咱們有一個圖書館管理的應用程序。3d

咱們已經爲圖書處理建立了一個接口IBook。而後,假設咱們在IBook接口中聲明瞭兩個方法。code

請參閱下面的接口結構。

public interface IBook  
    {  
        void AddBook(string bookName, string autherName);  
        void removeBook(string bookName);  
    }

而後,咱們有多個類繼承了這個接口,以下所示

public class Book : IBook  
{  
    public void AddBook(string bookName, string autherName)  
    {  
        Console.WriteLine("Book {0} added!",bookName);  
    }  
  
    public void removeBook(string bookName)  
    {  
        Console.WriteLine("Book {0} Removed!",bookName);  
    }  
}

在第一階段完成以後,咱們已經交付了應用程序。

在第二階段,客戶想要一個給書本進行評級的功能。

所以,咱們能夠在IBook接口中添加另外一個方法,以下所示。

public interface IBook  
    {  
        void AddBook(string bookName, string autherName);  
        void removeBook(string bookName);  
        void rateBook(int bookID);  
    }

而後,咱們須要在繼承該接口的全部類中實現該方法。

不然,繼承這個接口的類將引起錯誤,以下所示。

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

若是咱們爲接口方法提供一個定義,咱們將獲得如下錯誤。

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

即便咱們僅僅只是在一個模塊或類中須要這個新方法,咱們也應該對使用這個接口的全部模塊/類進行更改。

對於一個小應用程序來講,這不會有太大的工做量。可是對於更大的應用程序來講,在接口中進行更改可能會致使更多的問題,如應用程序失敗、bug、構建和交付問題等等。

可是在C#8.0中Microsoft 團隊經過引入默認接口實現特性爲這種狀況引入了一種簡單的解決方案。

在C#8.0中,咱們能夠爲接口成員定義默認定義。

請參閱下面的接口聲明。

public interface IBook  
{  
    void AddBook(string bookName, string autherName);  
    void removeBook(string bookName);  
  
    void rateBook(int bookID)  
    {                          
        //default logic here  
        Console.WriteLine("\nExecuted the Default implementation in the interface");  
    }  
}

讓咱們從Main方法調用該方法,以下所示。

static void Main(string[] args)  
        {  
            IBook ib = new Book();  
            ib.AddBook("Wings of Fire","Dr.A.P.J Abdul Kalam");  
            ib.removeBook("Belated Bachelor Party");  
  
            ib.rateBook(1);  
        }

輸出以下。

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

因爲咱們沒有覆蓋類中的rateBook()方法,所以將執行接口中的默認實現。

可是,若是在類中重寫此方法,類中的實現將被執行。

下面的代碼中給出了這個方法的一個新的實現,以下所示。

public class Book : IBook  
    {  
        public void AddBook(string bookName, string autherName)  
        {  
            Console.WriteLine("Book {0} added!", bookName);  
        }  
  
        public void removeBook(string bookName)  
        {  
            Console.WriteLine("Book {0} Removed!", bookName);  
        }  
        public void rateBook(int bookID)  
        {  
            Console.WriteLine("\nOverride : Executed the implementation in the class");  
        }  
    }

若是咱們運行應用程序,咱們將獲得如下結果

C# 8.0 - Default Interface Implementation - A New Feature Which Makes The Interface More Flexible

這彷佛是一個有趣的特性,這將有助於咱們的架構重構工做,並使接口更加靈活。

快樂學習~~~~~

好久沒寫文章了,有點生疏了,接下來準備抽時間寫寫C#中的異步,聊聊個人理解~~~歡迎你們加入.net core兩千人交流羣637326624交流

原文:https://www.c-sharpcorner.com/article/working-with-default-interface-implementation-in-c-sharp-8-0/

相關文章
相關標籤/搜索