天天看點

面向對象——抽象類與抽象方法

如果一個類不與具體的食物相聯系,而隻表達一種抽象的概念,僅是作為其派生類的一個基類,這樣的類就是派生類,在抽象類中,聲明抽象類中聲明抽象方法是,如果加上abstract關鍵字則為抽象方法。abstract 修飾符可用于類、方法、屬性、索引器和事件。

在類聲明中使用abstract 修飾符以訓示某個類隻能是其他類的基類。

标記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實作。

通過在類定義前面放置關鍵字 abstract,可以将類聲明為抽象類。例如:

public abstract class A

{

   // Class members here.

}

抽象類的用途是提供多個派生類可共享的基類的公共定義。

抽象類具有以下特性:

抽象類不能執行個體化。

抽象類可以包含抽象方法和抽象通路器。

不能用sealed修飾符修飾抽象類,因為這兩個修飾符的含義是相反的。采用sealed 修飾符的類無法繼承,而abstract 修飾符要求對類進行繼承。

從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象通路器的實際實作。

抽象類必須為所有接口成員提供實作。

實作接口的抽象類可以将接口方法映射到抽象方法上。例如:

interface I

{void M();}

abstract class C : I

public abstract void M();

抽象方法是隐式的虛方法。

由重寫方法override提供實作,此重寫方法是非抽象類的一個成員。

隻允許在抽象類中使用抽象方法聲明。

在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。

當抽象類從基類繼承虛方法時,抽象類可以使用抽象方法重寫該虛方法。例如:

public class D

public virtual void DoWork(inti)      {   // Original implementation.    }

public abstract class E : D

{ public abstract override void DoWork(inti);}

public class F : E  

public override void DoWork(inti)  

{  // New implementation.  }

如果将 virtual 方法聲明為 abstract,則該方法對于從抽象類繼承的所有類而言仍然是虛方法。

繼承抽象方法的類不能通路該方法的原始實作。

在上例中,類F 的DoWork不能調用類D中的DoWork。通過這種方式,抽象類可以強制派生類為虛方法提供新的方法實作。除了在聲明和調用文法上不同外,抽象屬性的行為與抽象方法一樣。在靜态屬性上使用 abstract 修飾符是錯誤的。

在派生類中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。

例:自定義抽象類計算圓形面積

public partial class Form1 : Form

   {

public Form1()

{InitializeComponent();}

private void button1_Click(object sender, EventArgs e)

       {

CalcAreacalcArea = new CalcArea();//執行個體化派生類

           Roll roll = calcArea;//使用派生類對象執行個體化抽象類

           string strNum=textBox1.Text.Trim();//記錄TextBox文本框中的内容

if (strNum != "")//判斷是否輸入了圓半徑

           {

try

               {

roll.R = int.Parse(strNum );//使用抽象類對象通路抽象類中的半徑屬性

                   textBox2.Text = roll.Area().ToString();//調用自定義方法進行求圓面積

               }

catch

MessageBox.Show("請輸入正确的圓半徑!");

           }

       }

   }

public abstract class Roll

   {  // 圓半徑

privateint r = 0;

publicint R

{ get {return r;}set{r = value;}  }

public abstract double Area();// 抽象方法,用來計算圓面積

   public class CalcArea : Roll//繼承抽象類

public override double Area()   // 重寫抽象類中計算圓面積的方法

returnMath.PI * R * R;

虛拟方法和抽象方法有什麼差別?

抽象方法隻有聲明沒有實作,需要在子類中實作;虛拟方法有聲明和實作,并且可以在子類中覆寫,也可以不覆寫使用父類的預設實作,

虛拟方法有實作代碼,抽象方法則沒有,

并且抽象類不能被執行個體化,隻能執行個體化實作了全部抽象方法的派生類

抽象方法是虛拟方法的一種

抽象方法沒有實作,它的存在隻是為派生類統一接口;派生類應該實作這個方法

如果編寫一個基類,它永遠不會被實作,那麼就應該将這個類中的一個或多個方法定義為

抽象方法。

抽象方法隻存在于抽象類中,有抽象方法的類必須定義為抽象類

其實大家首先要搞清楚,虛方法與多态性關系密切,虛方法允許派生類完全或部分重寫該類的方法,需寫方法體。抽象類中可以包含抽象方法與一般的方法,抽象類不可以new,抽象方法隻是一個定義,沒有方法體,也就是沒有{},也不要在裡面寫内容。它們兩個相像的一點是都用override重寫

繼續閱讀