【5min+】 巨大的爭議?C# 8 中的介面
阿新 • • 發佈:2020-02-17
系列介紹
【五分鐘的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# 中的另外一種事物行成了鮮明的對比,是的,抽象類。不知道大家有沒有在各種面試中遇到過這樣的提問:“介面能有任何的訪問修飾符嗎?”,“介面和抽象類的區別是什麼?”
曾經您可以和自然的脫口而出答案:“沒有修飾符。一個可以有預設方法,一個只能申明方法…………”。 但是從現在開始:這些答案是錯的了。