C# 8.0 的默认接口方法
例子
直接看例子
有這樣一個接口:?
?
然后有三個它的實現類:?
?
然后在main方法里面調用:?
截至目前,程序都可以成功的編譯和運行。?
?
IPerson接口變更?
突然,我想對所有的人類添加一個新的特性,例如,添加一個自我介紹的方法,所以我在IPerson里添加了Introduce()這個方法:?
?
現在再次Build一下項目,肯定會失敗的:?
因為這個方法在三個實現類里面都沒有實現。?
?
使用默認的實現來更新接口?
如果在C#?8.0以前,我們肯定需要把三個實現類都實現一下這個Introduce()?方法。而在C#?8.0里,我們可以在IPerson接口里做一個默認的方法實現:?
?
再次Build之后,您會發現就沒有錯誤了:?
?
而且我們也可以在所有的實現類上正常的調用這個方法:?
?
我沒有設置任何屬性,但是結果是沒問題的。?
?
但是,不可以直接在實現類上調用該方法,例如這樣寫就會報錯:?
這是因為Teacher這個實現類并沒有定義Introduce()這個方法。?
在前面的例子的里,我是通過IPerson接口調用的這個方法,這是沒有問題的,因為IPerson這個接口定義了這個方法。?
?
接口的靜態成員?
上面例子的輸出是這樣的:?
?
而我想讓輸出有默認的名字和年齡,在C#?8.0里面,我們可以這樣做,添加靜態字段(field)和靜態方法:?
實際上這個不會報錯的,出現紅色波浪線的原因可能是因為我的Resharper和VS沒有升級,Build會成功的。?
?
這里面我做的有點“脫褲子放屁”,但我僅僅是為了展示語言的新特性。?
?
然后在調用的時候,我們可以在IPerson接口上先設置默認值:?
?
然后運行:?
可以看到,由于各個實現類都沒有自己的實現,所以都輸出了默認值。?
?
在類上實現接口方法?
在Teacher類上實現Introduce()這個方法:?
?
然后就可以調用Teacher上的Introduce()方法了:?
?
運行程序:?
可以看到無論是通過Teacher類的實例還是通過IPerson接口,最終調用的都是Teacher類實現的Introduce()方法。?
詳細介紹請點擊原文鏈接。
總結
以上是生活随笔為你收集整理的C# 8.0 的默认接口方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解.NET Core的基元: de
- 下一篇: C# 8 新特性 - using 声明