程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 淺談接口、抽象類、抽象方法和虛方法的區別

淺談接口、抽象類、抽象方法和虛方法的區別

編輯:關於C語言

C#抽象類接口孩子間在對於抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於抽象類和接口的選擇顯得比較隨意。其實,兩者之間還是有很大區別的。

首先說一下接口與抽象類的異同:

相同點:

1.他們都不能實例化自己,也就是說都是用來被繼承的。

2.抽象類中的抽象方法和接口方法一樣,都不能有方法體

不同點:

1.抽象類裡可以有字段,接口中不能有字段.

2.抽象類中的普通方法可以有方法體,而接口方法沒有方法體。

3.接口中的方法不能有訪問修飾符,抽象類中的抽象方法被繼承,需要override重寫 .

4.接口更像是一種規范,一種約束。

5.一個子類只能繼承一個抽象類,但卻可以繼承多個接口。

接下來是抽象方法和虛方法的異同:

其實可以把抽象方法看做是沒有方法體的虛方法。

相同點:

1.抽象方法和虛方法都可以被重寫。

不同點

1.abstract 和virtual的關鍵字不同

2.抽象方法一定沒有方法體,而虛方法可以有方法體。

下面寫個例子說明一下:

  1. /// <summary>  
  2. /// 一個手機的抽象類  
  3. /// </summary>  
  4. public abstract class Mobilephone   
  5. {  
  6. private string _logo;  
  7. public string Logo  
  8. {  
  9. get { return _logo; }  
  10. set { _logo = value; }  
  11. }  
  12. public abstract void Call();  
  13. public virtual void Callagain()   
  14. {  
  15. Console.WriteLine("我再打一個電話");  
  16. }  
  17. }  
  18. /// <summary>  
  19. /// 定義一個實體類,繼承了一個抽象類及多個接口  
  20. /// </summary>  
  21. public class Nokia :Mobilephone,IClock,Ilistenmusic  
  22. {  
  23. public override void Call()  
  24. {  
  25. Console.WriteLine("NOKIA打電話沒問題");  
  26. }  
  27. public void clock()  
  28. {  
  29. Console.WriteLine("NOKIA的手機也有鬧鐘功能");  
  30. }  
  31. public void listenmusic()  
  32. {  
  33. Console.WriteLine("NOKIA的手機還能聽歌");  
  34. }  
  35. public override void Callagain()   
  36. {  
  37. Console.WriteLine("算了,還是不打了");  
  38. }  
  39. }  
  40. /// <summary>  
  41. /// 下面定義了兩個接口,為了說明可以繼承多個接口  
  42. /// </summary>  
  43. public interface Ilistenmusic   
  44. {  
  45. void listenmusic();  
  46. }  
  47. public interface IClock   
  48. {  
  49. void clock();  
  50. }  

在補充一個小例子,

這裡有到很有意思的面試題,說名了new關鍵字和override的區別:

  1. class Program   
  2. {   
  3. static void Main(string[] args)   
  4. {   
  5. B5 b5 = new B5();   
  6. b5.MethodB();   
  7. }   
  8. }   
  9. public class A5   
  10. {   
  11. public virtual void MethodA()   
  12. {   
  13. Console.WriteLine("A5.MethodA");   
  14. Console.Read();   
  15. }   
  16. public virtual void MethodB()   
  17. {   
  18. MethodA();   
  19. }   
  20. }   
  21. public class B5 :A5   
  22. {   
  23. public new void MethodA()   
  24. {   
  25. Console.WriteLine("B5.MethodA");   
  26. Console.ReadLine();   
  27. }   
  28. }   
  29. class Program  
  30. {  
  31. static void Main(string[] args)  
  32. {  
  33. B5 b5 = new B5();  
  34. b5.MethodB();  
  35. }  
  36. }  
  37. public class A5  
  38. {  
  39. public virtual void MethodA()  
  40. {  
  41. Console.WriteLine("A5.MethodA");  
  42. Console.Read();  
  43. }  
  44. public virtual void MethodB()  
  45. {  
  46. MethodA();  
  47. }  
  48. }  
  49. public class B5 :A5  
  50. {  
  51. public new void MethodA()   
  52. {  
  53. Console.WriteLine("B5.MethodA");  
  54. Console.ReadLine();  
  55. }  
  56. }  

最後的答案是:"A5.MethodA"

【編輯推薦】

  1. 分享c#常用函數和方法集
  2. c#.Net實體類序列化方法
  3. C#中的閉包是怎麼捕獲變量的
  4. 解析C#委托、時間和Lambda表達式
  5. 用C#實現HTTP協議下的多線程文件傳輸
【責任編輯:QiHappy TEL:(010)68476606】
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved