C#接口和抽象類的區別

C#接口和抽象類的相同:

1.都不能對方法或屬性的具體的實現;

2.都可以被繼承;

3.都不可以被實例化。

C#接口和抽象類的區別:

1.接口是一種類型,不能包含靜態的成員,不能包括變量的定義,定義的方法或屬性默認爲public的,不能加public修飾,繼承接口的類在實現接口的成員時必須爲public的。

2.抽象類本身是類的修飾符,不是一種類型,可以有靜態的成員,變量的定義,非抽象的方法(但必須實現),可以有virtual方法,抽象類的子類必須全部實現父類中的抽象的

成員,且應與父抽象類的抽象成員的修飾一致(即public或protected).

C#接口和抽象類絕對經典示例

.NET Framework是學習的最好資源,有意識的研究FCL是每個.NET程序員的必修課,關於接口和抽象類在FCL中的使用,我有以下的建議:

FCL對集合類使用了基於接口的設計,所以請關注System.Collections中關於接口的設計實現;

FCL對數據流相關類使用了基於抽象類的設計,所以請關注System.IO.Stream類的抽象類設計機制。

C#接口和抽象類Animal示例

下面的實例,因爲是我的理解,因此給經典打上“相對”的記號,至於什麼時候晉升爲“絕對”,就看我在.NET追求的路上,是否能夠一如既往的如此執着,因此我將把相對重構到絕對爲止(呵呵)。 本示例沒有闡述抽象類和接口在設計模式中的應用,因爲那將是另一篇有討論價值的文本,本文着眼與概念和原則的把握,但是真正的應用來自於具體的需求規範。

設計結構如圖所示:

設計結構圖

1. 定義抽象類

  1. public abstract class Animal
  2. {
  3. protected string _name;
  4. //聲明抽象屬性
  5. public abstract string Name
  6. {
  7. get;
  8. }
  9. //聲明抽象方法
  10. public abstract void Show();
  11. //實現一般方法
  12. public void MakeVoice()
  13. {
  14. Console.WriteLine("All animals can make voice!");
  15. }
  16. }

2. 定義接口

  1. public interface IAction
  2. {
  3. //定義公共方法標籤
  4. void Move();
  5. }

3. 實現抽象類和接口

  1. public class Duck : Animal, IAction
  2. {
  3. public Duck(string name)
  4. {
  5. _name = name;
  6. }
  7. //重載抽象方法
  8. public override void Show()
  9. {
  10. Console.WriteLine(_name + " is showing for you.");
  11. }
  12. //重載抽象屬性
  13. public override string Name
  14. {
  15. get { return _name;}
  16. }
  17. //實現接口方法
  18. public void Move()
  19. {
  20. Console.WriteLine("Duck also can swim.");
  21. }
  22. }
  23. public class Dog : Animal, IAction
  24. {
  25. public Dog(string name)
  26. {
  27. _name = name;
  28. }
  29. public override void Show()
  30. {
  31. Console.WriteLine(_name + " is showing for you.");
  32. }
  33. public override string Name
  34. {
  35. get { return _name; }
  36. }
  37. public void Move()
  38. {
  39. Console.WriteLine(_name + " also can run.");
  40. }
  41. }

4. 客戶端實現

  1. public class TestAnmial
  2. {
  3. public static void Main(string [] args)
  4. {
  5. Animal duck = new Duck("Duck");
  6. duck.MakeVoice();
  7. duck.Show();
  8. Animal dog = new Dog("Dog");
  9. dog.MakeVoice();
  10. dog.Show();
  11. IAction dogAction = new Dog("A big dog");
  12. dogAction.Move();
  13. }
  14. }

dunai認爲:抽象類是提取具體類的公因式,而接口是爲了將一些不相關的類“雜湊”成一個共同的羣體。至於他們在各個語言中的句法,語言細節並不是我關心的重點。

Artech認爲:所代碼共用和可擴展性考慮,儘量使用Abstract Class。當然接口在其他方面的優勢,我認爲也不可忽視。

shenfx認爲:當在差異較大的對象間尋求功能上的共性時,使用接口;當在共性較多的對象間尋求功能上的差異時,使用抽象基類。

最後,有關C#接口和抽象類的學習,MSDN的建議:

如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都隨更改自動更新。另一方面,接口一旦創建就不能更改。如果需要接口的新版本,必須創建一個全新的接口。

如果創建的功能將在大範圍的全異對象間使用,則使用接口。抽象類應主要用於關係密切的對象,而接口最適合爲不相關的類提供通用功能。

如果要設計小而簡練的功能塊,則使用接口。如果要設計大的功能單元,則使用抽象類。

如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。抽象類允許部分實現類,而接口不包含任何成員的實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章