C#中抽象類(abstract)和接口(interface)的實現


抽象類


  抽象方法是沒有代碼實現的方法,使用abstract關鍵字修飾;

  1. 抽象類是包含0到多個抽象方法的類,其不能實例化。含有抽象方法的類必須是抽象類,抽象類中也可以包含非抽象方法;
  2. 重寫抽象類的方法用override關鍵字。
 1 //定義一個抽象類,包含一個抽象方法,但該方法未實現
 2 abstract class MyAbs{
 3     public abstract void AbMethod();            
 4 }
 5 //定義一個非抽象派生類,只能繼承一個類
 6 class MyClass:MyAbs{
 7      public override void AbMethod(){
 8         Console.WriteLine("此MyClass中實現父類中未實現的抽象方法!");
 9      }
10  }
11 //在主程序中實例化一個MyClass對象,並調用AbMethod方法
12 static void Main(string[] args){
13     MyClass objMyClass = new MyClass();
14     objMyClass.AbMethod();
15 }

 

  • 虛方法(virtual)與抽象方法(abstract)的區別
  1. 虛方法必須要有方法體,抽象方法不允許有方法體;
  2. 虛方法可以被子類(派生類)重載(override),抽象方法必須被子類重載;
  3. 虛方法除了在密封類中都可以寫,抽象方法只能在抽象類中寫。

 

接口


  接口是一套規范,遵守這個規范就可以實現功能。

  1. 接口中只定義方法的原型,不能有字段和常量;
  2. 繼承接口的類必須實現接口中所有的方法才能實例化
1 //隱式聲明為public
2 public interface IPict{
3     //只有方法聲明,沒有訪問修飾符,沒有實現
4     int DeleteImage();
5     void DisplayImage();
6 }

  定義派生自接口的類,並實現所有接口中的方法

 1 public class MyImages: IPict{
 2     //第一個方法的實現
 3     public int DeleteImage(){
 4         Console.WriteLine("DeleteImage實現!");
 5     }
 6     
 7     //第二個方法的實現
 8     public void DisplayImage(){
 9         Console.WriteLine("DisplayImage實現!");
10     }
11 }

  在主程序中實例化一個MyImages對象,並調用DeleteImage和DisplayImage方法

1 static void Main(string[] args){
2     MyImages ofjM = new MyImages();
3     objM.DisplayImage();
4     int t = objM.DeleteImage();
5     Console.WriteLine(t);
6 }

 

  • 多重接口實現

  C#不允許多重類繼承,但允許多重接口實現。但如果發生命名沖突就需要使用前綴進行顯式接口實現或調用。如果繼承接口的類中用顯示方法實現接口中的方法時,實現方法不需加訪問修飾符(public)

 1 public interface IPict{
 2     void DisplayImage();
 3 }
 4 
 5 public interface IPictManip{
 6     void DisplayImage();
 7 }
 8 
 9 public class MyImages: IPict, IPictManip{
10     void IPict.DisplayImage(){    //如果用顯示接口實現方法,則不需使用訪問修飾符 11         Console.WriteLine("DisplayImage的IPict實現");
12     }
13     void IPictManip.DisplayImage(){
14         Console.WriteLine("DisplayImage的IPictManip實現");
15     }
16 }
17 
18 static void Main(string[] args){
19     MyImages objM = new MyImages();
20     IPict Pict = objM;    //IPict引用
21     Pict.DisplayImage();
22     IPictManip PictManip = objM;  //IPictManip引用
23     PictManip.DisplayImage();
24 }

 

  • 使用自定義接口

  接口作為參數使用:接口作為參數傳遞了實現接口的對象

1 //無論誰收作業參數類型部分都不需做任何改變
2 private void DoCollectHomework(IHomeworkCollector collector){
3     collector.CollectHomework();
4 }
5 
6 DoCollectHomework(scofield);

  接口作為返回值使用:接口作為返回值返回了一個實現接口的對象

 1 private IHomeworkColletor CreateHomeworkCollector(string type){
 2     switch(type){
 3         case "student":
 4         collector = new Student("Scofield", Genders.Male, 28, "越獄");
 5         break;
 6     }
 7     //返回一個實現該接口的對象
 8     return collector
 9 }
10 
11 collector.CollectHomework();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM