C# 8.0 的默認接口方法

例子

直接看例子

有這樣一個接口:

C# 8.0 的默認接口方法

然後有三個它的實現類:

C# 8.0 的默認接口方法

然後在main方法裡面調用:

C# 8.0 的默認接口方法

截至目前,程序都可以成功的編譯和運行。

IPerson接口變更

突然,我想對所有的人類添加一個新的特性,例如,添加一個自我介紹的方法,所以我在IPerson裡添加了Introduce()這個方法:

C# 8.0 的默認接口方法

現在再次Build一下項目,肯定會失敗的:

C# 8.0 的默認接口方法

因為這個方法在三個實現類裡面都沒有實現。

使用默認的實現來更新接口

如果在C# 8.0以前,我們肯定需要把三個實現類都實現一下這個Introduce() 方法。而在C# 8.0裡,我們可以在IPerson接口裡做一個默認的方法實現:

C# 8.0 的默認接口方法

再次Build之後,您會發現就沒有錯誤了:

C# 8.0 的默認接口方法

而且我們也可以在所有的實現類上正常的調用這個方法:

C# 8.0 的默認接口方法

C# 8.0 的默認接口方法

我沒有設置任何屬性,但是結果是沒問題的。

但是,不可以直接在實現類上調用該方法,例如這樣寫就會報錯:

C# 8.0 的默認接口方法

這是因為Teacher這個實現類並沒有定義Introduce()這個方法。

在前面的例子的裡,我是通過IPerson接口調用的這個方法,這是沒有問題的,因為IPerson這個接口定義了這個方法。

接口的靜態成員

上面例子的輸出是這樣的:

C# 8.0 的默認接口方法

而我想讓輸出有默認的名字和年齡,在C# 8.0裡面,我們可以這樣做,添加靜態字段(field)和靜態方法:

C# 8.0 的默認接口方法

實際上這個不會報錯的,出現紅色波浪線的原因可能是因為我的Resharper和VS沒有升級,Build會成功的。

這裡面我做的有點“脫褲子放屁”,但我僅僅是為了展示語言的新特性。

然後在調用的時候,我們可以在IPerson接口上先設置默認值:

C# 8.0 的默認接口方法

然後運行:

C# 8.0 的默認接口方法

可以看到,由於各個實現類都沒有自己的實現,所以都輸出了默認值。

在類上實現接口方法

在Teacher類上實現Introduce()這個方法:

C# 8.0 的默認接口方法

然後就可以調用Teacher上的Introduce()方法了:

C# 8.0 的默認接口方法

運行程序:

C# 8.0 的默認接口方法

可以看到無論是通過Teacher類的實例還是通過IPerson接口,最終調用的都是Teacher類實現的Introduce()方法。


分享到:


相關文章: