1. 程式人生 > >抽象類和介面的異同及例項解析

抽象類和介面的異同及例項解析

與具體類比較

  1. 抽象類不能直接例項化,並且對抽象類使用 new 運算子會導致 編譯時錯誤。雖然一些變數和值在編譯時的 型別可以是抽象的,但是這樣的變數和值必須或者為 null,或者含有對非抽象類的例項的 引用(此非抽象類是從抽象類派生的)。
  2. 允許(但不要求)抽象類包含抽象成員。
  3. 抽象類不能被密封。

與介面比較

抽象類表示該類中可能已經有一些方法的具體定義,但是介面就僅僅只能定義各個方法的介面(方法名,引數列表,返回型別),並不關心具體細節。 介面是引用型別的,和抽象類的相似之處有三點:
  1. 不能例項化;
  2. 包含未實現的方法宣告;
  3. 派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員(不僅是方法包括其他成員)。
抽象類與介面緊密相關。然而介面又比抽象類更抽象,這主要體現在它們的差別上:
  1. 類可以實現無限個介面,但僅能從一個抽象(或任何其他型別)類繼承,從抽象類派生的類仍可實現介面,從而得出介面是用來解決多重繼承問題的。
  2. 抽象類當中可以存在非抽象的方法,可介面不能,且它裡面的方法只是一個宣告必須用public來修飾沒有具體實現的方法。
  3. 抽象類中的
    成員變數
    可以被不同的修飾符來修飾,可介面中的成員變數預設的都是靜態常量(static final)。
  4. 抽象類是物件的抽象,然而介面是一種行為規範。

例項:

  1     #region 星探-美女
  2     /// <summary>
  3     /// 好身材美女
  4     /// </summary>
  5     public interface IGoodBodyGirl
  6     {
  7         /// <summary>
  8         /// 好面孔
  9         ///
</summary> 10 void NiceFace(); 11 /// <summary> 12 /// 好身材 13 /// </summary> 14 void NiceFigure(); 15 } 16 /// <summary> 17 /// 好氣質美女 18 /// </summary> 19 public interface IGreatTemperamentGirl 20 { 21 /// <summary> 22 /// 好氣質 23 /// </summary> 24 void GreatTemperament(); 25 } 26 27 public interface IPettyGirl 28 { 29 /// <summary> 30 /// 好面孔 31 /// </summary> 32 void NiceFace(); 33 /// <summary> 34 /// 好身材 35 /// </summary> 36 void NiceFigure(); 37 /// <summary> 38 /// 好氣質 39 /// </summary> 40 void GreatTemperament(); 41 } 42 43 public class PettyGirlNew : IPettyGirl 44 { 45 private string name { get; set; } 46 public PettyGirlNew(string name) 47 { 48 this.name = name; 49 } 50 public void GreatTemperament() 51 { 52 Console.WriteLine($"{this.name},很有氣質!"); 53 } 54 55 public void NiceFace() 56 { 57 Console.WriteLine($"{this.name},臉蛋很漂亮!"); 58 } 59 60 public void NiceFigure() 61 { 62 Console.WriteLine($"{this.name},身材很棒!"); 63 } 64 } 65 66 public class PettyGirl : IGoodBodyGirl, IGreatTemperamentGirl 67 { 68 public string name { get; set; } 69 public PettyGirl(string name) 70 { 71 this.name = name; 72 } 73 public void GreatTemperament() 74 { 75 Console.WriteLine($"{this.name},很有氣質!"); 76 } 77 78 public void NiceFace() 79 { 80 Console.WriteLine($"{this.name},臉蛋很漂亮!"); 81 } 82 83 public void NiceFigure() 84 { 85 Console.WriteLine($"{this.name},身材很棒!"); 86 } 87 } 88 89 public abstract class AbstractSearcher 90 { 91 public IPettyGirl pettyGirl { get; set; } 92 public AbstractSearcher(IPettyGirl pettyGirl) 93 { 94 this.pettyGirl = pettyGirl; 95 } 96 public abstract void Show(); 97 } 98 99 public class Searcher : AbstractSearcher 100 { 101 public Searcher(IPettyGirl pettyGirl) : base(pettyGirl) 102 { 103 } 104 public override void Show() 105 { 106 Console.WriteLine($"美女資訊如下:"); 107 base.pettyGirl.NiceFace(); 108 base.pettyGirl.GreatTemperament(); 109 base.pettyGirl.NiceFigure(); 110 } 111 } 112 113 #endregion