抽象類
抽象方法是沒有代碼實現的方法,使用abstract關鍵字修飾;
- 抽象類是包含0到多個抽象方法的類,其不能實例化。含有抽象方法的類必須是抽象類,抽象類中也可以包含非抽象方法;
- 重寫抽象類的方法用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)的區別
- 虛方法必須要有方法體,抽象方法不允許有方法體;
- 虛方法可以被子類(派生類)重載(override),抽象方法必須被子類重載;
- 虛方法除了在密封類中都可以寫,抽象方法只能在抽象類中寫。
接口
接口是一套規范,遵守這個規范就可以實現功能。
- 接口中只定義方法的原型,不能有字段和常量;
- 繼承接口的類必須實現接口中所有的方法才能實例化
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();