C# 程式設計/抽象類
外觀
一般來說,介面是元件的公共成員集。當然,這對 C# 介面 也是如此。C# 類也定義了一個介面,因為它有一組公共成員。非抽象 C# 類定義了每個成員的實現。
在 C# 中,可以擁有介於不定義任何實現的純介面和定義完整實現的型別之間的型別。這稱為抽象類,透過在類定義中包含 abstract 關鍵字來定義。
抽象類介於 C# 介面和非抽象類之間。在抽象類定義的公共成員中,任何數量的這些成員都可以包含實現。
例如,抽象類可能為所有成員提供實現。
public abstract class AbstractShape
{
public abstract void Draw(Graphics g);
public abstract double X {get; set;}
public abstract double Y {get; set;}
}
從許多方面來說,此類等效於介面。(一個區別是,從該類派生的類不能從任何其他類派生。)
抽象類也可以定義所有成員。
public abstract class AbstractShape
{
private double _x;
private double _y;
//
// ... (other members)
//
public void Draw(Graphics g) {g.DrawRectangle(Pens.Black, g_rect);}
public double X {get{return _x;}}
public double Y {get{return _y;}}
}
抽象類還可以定義一些成員,但留下其他成員未定義。
public abstract class AbstractShape
{
private double _x;
private double _y;
//
// ... (other members)
//
public abstract void Draw(Graphics g);
public double X {get{return _x;}}
public double Y {get{return _y;}}
}
雖然抽象類類似於非抽象類,但存在一些重要的區別。首先,您不能使用 new 關鍵字建立抽象類的例項。例如,以下語句將引發編譯器錯誤
AbstractShape shape = new AbstractShape();
當然,假設具體類 Square 從 AbstractShape 派生,則以下將是正確的
AbstractShape shape = new Square();
第二個區別是抽象類可能具有抽象成員。如上所示,這不是必需的。要建立至少具有一個抽象成員的類,必須在 class 關鍵字之前新增 abstract 關鍵字。
第三個區別是類不能同時是 abstract 和 sealed。
與虛方法一樣,您可以使用 override 關鍵字實現抽象方法或屬性
public class Rectangle : AbstractShape
{
private double _x;
private double _y;
// ...
public override void Draw(Graphics g)
{
g.DrawRectangle(Pens.Black, g_rect);
}
public override double X {
get { return _x; }
set { _x = value; }
}
public override double Y {
get { return _y; }
set { _y = value; }
}
}
覆蓋抽象方法與覆蓋虛方法實際上相同 - 您不能更改訪問說明符(即您不能將受保護的抽象方法轉換為公共方法),並且您不能向抽象屬性新增丟失的 get 或 set。唯一的區別是,如果您忘記了 new 或 override 關鍵字,則會產生錯誤,如果該方法所屬的類是從抽象類派生的,並且如果該類嘗試覆蓋虛方法,則會產生警告。