1. 程式人生 > >【5min+】 巨大的爭議?C# 8 中的介面

【5min+】 巨大的爭議?C# 8 中的介面

系列介紹

【五分鐘的dotnet】是一個利用您的碎片化時間來學習和豐富.net知識的博文系列。它所包含了.net體系中可能會涉及到的方方面面,比如C#的小細節,AspnetCore,微服務中的.net知識等等。
5min+不是超過5分鐘的意思,"+"是知識的增加。so,它是讓您花費5分鐘以下的時間來提升您的知識儲備量。

正文

伴隨著 .NET Core 3.0 一起釋出的 C# 8 ,從釋出至今已經過了快大半年了。如果您細心的話,就能發現在C# 8新增的功能中有一條:“預設介面方法” 。 半年前當我看到這一新特性的時候,我驚呆了,但是驚訝之餘是更多的疑惑。因為對於介面這個東西來說,從C#釋出至今的十多年裡幾乎一直保持它的樣子,然而在C# 8之後,它有了巨大的變化。隨著而來,也是各種爭論的聲音。

很早之前我就想寫這篇文章了,但是由於各種原因一直拖延到了現在。

先讓我們來回顧一下 C# 中原有的介面有什麼特點:

  • 介面類似於只有抽象成員的抽象基類。 實現介面的任何類或結構都必須實現其所有成員。
  • 介面無法直接進行例項化。 其成員由實現介面的任何類或結構來實現。
  • 介面可以包含事件、索引器、方法和屬性。
  • 介面不含方法的實現。
  • 一個類或結構可以實現多個介面。 一個類可以繼承一個基類,還可實現一個或多個介面。

也正是基於這些特點,當我們在介面中為一個方法加上"pulic"等關鍵字的時候,編譯器會提示我們這是一個錯誤的寫法:

interface IRepository
{
    //Compile-time error CS0106 The modifier 'public' is not valid for this item.
    public void Add();
}

所以更不用談給方法寫一個實現了。這就讓它和 C# 中的另外一種事物行成了鮮明的對比,是的,抽象類。不知道大家有沒有在各種面試中遇到過這樣的提問:“介面能有任何的訪問修飾符嗎?”,“介面和抽象類的區別是什麼?”

曾經您可以和自然的脫口而出答案:“沒有修飾符。一個可以有預設方法,一個只能申明方法…………”。 但是從現在開始:這些答案是錯的了。