直接看例子ui
有這樣一個接口: spa
而後有三個它的實現類: orm
而後在main方法裏面調用: xml
截至目前,程序均可以成功的編譯和運行。 接口
忽然,我想對全部的人類添加一個新的特性,例如,添加一個自我介紹的方法,因此我在IPerson裏添加了Introduce()這個方法: ip
如今再次Build一下項目,確定會失敗的: 文檔
由於這個方法在三個實現類裏面都沒有實現。 get
使用默認的實現來更新接口 string
若是在C# 8.0之前,咱們確定須要把三個實現類都實現一下這個Introduce() 方法。而在C# 8.0裏,咱們能夠在IPerson接口裏作一個默認的方法實現: it
再次Build以後,您會發現就沒有錯誤了:
並且咱們也能夠在全部的實現類上正常的調用這個方法:
我沒有設置任何屬性,可是結果是沒問題的。
可是,不能夠直接在實現類上調用該方法,例如這樣寫就會報錯:
這是由於Teacher這個實現類並無定義Introduce()這個方法。
在前面的例子的裏,我是經過IPerson接口調用的這個方法,這是沒有問題的,由於IPerson這個接口定義了這個方法。
上面例子的輸出是這樣的:
而我想讓輸出有默認的名字和年齡,在C# 8.0裏面,咱們能夠這樣作,添加靜態字段(field)和靜態方法:
實際上這個不會報錯的,出現紅色波浪線的緣由多是由於個人Resharper和VS沒有升級,Build會成功的。
這裏面我作的有點「脫褲子放屁」,但我僅僅是爲了展現語言的新特性。
而後在調用的時候,咱們能夠在IPerson接口上先設置默認值:
而後運行:
能夠看到,因爲各個實現類都沒有本身的實現,因此都輸出了默認值。
在Teacher類上實現Introduce()這個方法:
而後就能夠調用Teacher上的Introduce()方法了:
運行程序: