C# 8.0 的默認接口方法

例子

直接看例子ui

有這樣一個接口: spa

public interface IPerson 
2 references 
{ get; set; 
string 
Name 
2 references 
{ get; set; } 
int 
Age

 

而後有三個它的實現類: orm

public class Teacher 
IPerson 
6 references 
public string Name { get; set; 
3 references 
public int Age { get; set; } 
I reference 
public class Student 
IPerson 
6 references 
public string Name { get; set; 
3 references 
public int Age { get; set; } 
I reference 
public class Actor 
IPerson 
6 references 
public string Name { get; set; 
3 references 
public int Age { get; set; }

 

而後在main方法裏面調用: xml

static void Elgin(stringC] 
gx•gs 
new Teacher(); 
var teacher = 
new Student(); 
var student = 
new Actor(); 
var actor = 
Console . WriteLine( teacher . Name); 
Console . WriteLine(student . Name); 
Console . WriteLine( actor . Name);

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

 

IPerson接口變動 

忽然,我想對全部的人類添加一個新的特性,例如,添加一個自我介紹的方法,因此我在IPerson裏添加了Introduce()這個方法: ip

public interface IPerson 
S references 
{ get; set; 
string 
Name 
3 references 
{ get; set; } 
int 
Age 
O references 
Introduce() 
void

 

如今再次Build一下項目,確定會失敗的: 文檔

irror List 
Entire Solution 
Code 
O CS0535 
O CS0535 
O CS0535 
Description 
'Teacher' does not implement interface member 'IPerson.IntroduceO' 
'Student' does not implement interface member 'IPerson.IntroduceO' 
'Actor' does not implement interface member 'IPerson.IntroduceO'

由於這個方法在三個實現類裏面都沒有實現。 get

 

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

若是在C# 8.0之前,咱們確定須要把三個實現類都實現一下這個Introduce() 方法。而在C# 8.0裏,咱們能夠在IPerson接口裏作一個默認的方法實現: it

public interface IPerson 
7 references 
string Name { get; set; 
4 references 
int Age { get; set; } 
O references 
Introduce() 
void 
Console.WriteLine($"I'm 
{Name} , 
{Age} years old. " ) ,

 

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

utput 
how output from: Build 
ConsoleÅppl, on: Debug Any CPU 
started: projec 
D: OlCorEoI•App1. 811 
succeeded. O O

 

並且咱們也能夠在全部的實現類上正常的調用這個方法: 

static void Mgin(stringC] 
gx•gs 
var 
var 
var 
var 
new Teacher(); 
teacher = 
new Student(); 
student = 
new Actor(); 
actor = 
C] { teacher, 
new IPerson 
persons = 
student, 
actor } ; 
foreach (var person in persons) 
person . Introduce( ) ;

 

I'm 
I'm 
I'm 
years old. 
years old. 
years old.

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

 

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

var 
var 
var 
new Teacher(); 
teacher = 
new Student(); 
student = 
new Actor(); 
actor = 
teacher . Introduce( ) ;

這是由於Teacher這個實現類並無定義Introduce()這個方法。 

在前面的例子的裏,我是經過IPerson接口調用的這個方法,這是沒有問題的,由於IPerson這個接口定義了這個方法。 

 

接口的靜態成員 

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

I'm 
I'm 
I'm 
years old. 
years old. 
years old.

 

而我想讓輸出有默認的名字和年齡,在C# 8.0裏面,咱們能夠這樣作,添加靜態字段(field)和靜態方法: 

public interface IPerson 
private static string DefaultName - 
private static int 20; 
O references 
"Jane Doe"; 
SetNameAndAge(string name, int age) 
static void 
DefaultName 
= name; 
DefaultAge 
= age; 
5 references 
string Name 
get; set; 
5 references 
int Age { get; set; } 
I reference 
void Introduce() 
Name = 
DefaultName; 
DefaultAge; 
Age - 
Console.WriteLine($"I'm {Name}, 
{Age} years old. " ) ,

實際上這個不會報錯的,出現紅色波浪線的緣由多是由於個人Resharper和VS沒有升級,Build會成功的。 

 

這裏面我作的有點「脫褲子放屁」,但我僅僅是爲了展現語言的新特性。 

 

而後在調用的時候,咱們能夠在IPerson接口上先設置默認值: 

IPerson.SetNameAndAge( 
"Nick", 
name: 
new Teacher(); 
var teacher = 
new Student(); 
var student = 
new Actor() 
var actor = 
// teacher. Introduce(); 
38); 
age: 
C] { teacher, 
new IPerson 
var persons = 
foreach (var person in persons) 
person . Introduce( ) ; 
student, 
actor } ;

 

而後運行: 

I'm Nick, 38 years old. 
I'm Nick, 38 years old. 
I'm Nick, 38 years old.

能夠看到,因爲各個實現類都沒有本身的實現,因此都輸出了默認值。 

 

在類上實現接口方法 

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

 

而後就能夠調用Teacher上的Introduce()方法了: 

 

運行程序: 

能夠看到不管是經過Teacher類的實例仍是經過IPerson接口,最終調用的都是Teacher類實現的Introduce()方法。 

 

更詳細的文檔請點擊這裏查看

相關文章
相關標籤/搜索