9月份的時候,微軟宣佈正式發佈C#8.0,做爲.NET Core 3.0發行版的一部分。C#8.0的新特性之一就是默認接口實現。在本文中,咱們將一塊兒來聊聊默認接口實現。
做者:依樂祝
原文連接:http://www.javashuo.com/article/p-ufrubfpw-dc.htmlhtml
提早說下:編程
衆所周知,對現有應用程序的接口進行更改是一項很危險的操做。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); }
而後,咱們須要在繼承該接口的全部類中實現該方法。
不然,繼承這個接口的類將引起錯誤,以下所示。
若是咱們爲接口方法提供一個定義,咱們將獲得如下錯誤。
即便咱們僅僅只是在一個模塊或類中須要這個新方法,咱們也應該對使用這個接口的全部模塊/類進行更改。
對於一個小應用程序來講,這不會有太大的工做量。可是對於更大的應用程序來講,在接口中進行更改可能會致使更多的問題,如應用程序失敗、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); }
輸出以下。
因爲咱們沒有覆蓋類中的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#中的異步,聊聊個人理解~~~歡迎你們加入.net core兩千人交流羣637326624
交流
原文:https://www.c-sharpcorner.com/article/working-with-default-interface-implementation-in-c-sharp-8-0/