c#圖解教程_第十五章_介面
阿新 • • 發佈:2021-08-02
宣告介面
定義:是指一組函式成員而不實現他們的引用型別,所以只能類和結構來實現介面
PS:介面的方法不需要具體的實現
實現類要做的事情
- 必須在基類列表後面列出介面的名稱
- 必須為介面的每一個成員(方法)提供實現
- Run()方法是介面實現方法
- 介面不能定義欄位和靜態成員
- 介面成員不允許有任務的訪問修飾符,預設是public
- 介面名必須要以大寫‘I'開頭(IText)
public interface IAnimal{ void Run(string AnimalName); } class Cat:IAnimal{
public void Run(string name){Console.WriteLine($"{name} can be run") } }
class Dog: IAnimal{
public void Run(string name){
Console.WriteLine($"{name} can be run")
}
}
public class Program{
public static void Main(){
Cat cat = new Cat();
cat.Run("cat");
Dog dog = new Dog();
dog.run();
}
}
介面是引用型別
介面不僅僅類或結構要實現的成員列表。他是一個引用型別
一個類可以繼承多個介面
介面定義方法的具體實現的載體 public class StructClass:IClass{ int count = 0; public void AddCount(){ count +=1; } public void ShowCount(){ Console.WriteLine(count) } }
public interface IClass{
void AddCount();
void ShowCount();
}classProgram{ staticvoidMain(string[]args){
StructClasss1=newStructClass(); StructClasss2=s1; s1.AddCount(); s1.ShowCount();//輸出1 s2.ShowCount();//輸出0 //說明s2和s1不指向同一個物件,s2=s1是建立了一個s1的副本 //這是值型別很顯著的標誌 IClassic1=newStructClass(); IClassic2=ic1; ic1.AddCount(); ic1.ShowCount();//輸出1 ic2.ShowCount();//輸出1 //說明s2和s1指向同一個物件,s2=s1是將s1的引用賦給s2 //這是引用型別很顯著的標誌 } }
介面和as運算子
定義:使用as 運算子可以指定介面所實現的類
//如上圖程式碼稍作修改 public static void Main(){ StructClass s1 = new StructClass(); IClass ic1 = s1 as IClass; ic1.AddCount(); ic1.ShowCont(); //輸出1 }
多個介面同名方法的引用用顯示命名法區分
public interface IClass1{ //輸出 void Print(); } public interface IClass2{ //輸出 void Print(); } public class StructClass:IClass1,IClass2{ //兩種解決方案 //一種多個介面同名方法用一種實現通用解決 public void Print(); //第二種解決方案,使用限定介面名 public void IClass1.Print(){ Console.WriteLine("IClass1 print"); } public void IClass2.Print(){ Console.WriteLine("IClass2 print");
//值得注意一點的是,使用限定介面名會影響類的繼承
public void Method1()
Print(); //編譯錯誤
this.Print(); //編譯錯誤
((IClass1)this).Print(); //使用限定後的名稱編譯 }
}
介面可以繼承介面
定義:與類不同,它在基類列表中只能有一個類名,而介面可以在基介面列表中任意多個介面
- 列表中的介面本身可以繼承其他介面
- 介面包含它宣告的所有介面和所有基介面的成員
- 多個介面被一個介面繼承時,當這個集合被實現時,需要實現該介面的的所有介面方法
public interface IClass1{ void Point1(); } public interface IClass2:IClass1{ void Point2(); } public class StructClass:IClass2{ //兩個方法都得實現 public void Point1(); public void Point2();
}
public class Demo{
public static void Main(){
StructClass1 s1 = new StructClass1();
DemoTest(s1);
}
public void DemoTest(IClass1 c1){
c1.Point1();
}
}