C# 面向對象 抽象類和抽象方法


C# 面向對象 抽象類和抽象方法

如果一個類不與具體的食物相聯繫,而只表達一種抽象的概念,僅是作為其派生類的一個基類,這樣的類就是派生類,在抽象類中,聲明抽象類中聲明抽象方法是,如果加上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重寫


分享到:


相關文章: