1. 程式人生 > 其它 >c#圖解教程_第十五章_介面

c#圖解教程_第十五章_介面

宣告介面


定義:是指一組函式成員而不實現他們的引用型別,所以只能類和結構來實現介面

PS:介面的方法不需要具體的實現

實現類要做的事情

  1. 
必須在基類列表後面列出介面的名稱
  2. 
必須為介面的每一個成員(方法)提供實現

  3. Run()方法是介面實現方法
  4. 介面不能定義欄位和靜態成員

  5. 介面成員不允許有任務的訪問修飾符,預設是public
  6. 
介面名必須要以大寫‘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();
   }
}