abstract 關鍵詞可讓您建立不完整的類別和類別成員,而且必須在衍生類別中實作。
sealed 關鍵詞可讓您防止繼承先前標示為虛擬的類別或特定類別成員。
抽象類別和類別成員
類別可以藉由將 關鍵詞 abstract
放在類別定義之前,宣告為抽象。 例如:
public abstract class A
{
// Class members here.
}
抽象類別無法具現化。 抽象類的目的是提供多個衍生類別可以共用之基類的通用定義。 例如,類別庫可能會定義抽象類,該類別可用來做為其許多函式的參數,並要求程式設計人員使用該連結庫藉由建立衍生類別來提供類別本身的實作。
抽象類也可以定義抽象方法。 這可藉由在 方法的傳回型別之前新增 關鍵詞 abstract
來完成。 例如:
public abstract class A
{
public abstract void DoWork(int i);
}
抽象方法沒有實作,因此方法定義後面接著分號,而不是一般方法區塊。 抽象類的衍生類別必須實作所有抽象方法。 當抽象類從基類繼承虛擬方法時,抽象類可以使用抽象方法覆寫虛擬方法。 例如:
// compile with: -target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
如果將virtual
方法宣告為abstract
,匯出至任何繼承自該抽象類別的類別時,它仍然是虛擬方法。 繼承抽象方法的類別無法存取方法的原始實作,在上一個範例中, DoWork
在類別 F 上無法呼叫 DoWork
類別 D。如此一來,抽象類就可以強制衍生類別為虛擬方法提供新的方法實作。
密封類別和類別成員
類別可以藉由將 關鍵詞放在類別定義之前,宣告為 sealed
。 例如:
public sealed class D
{
// Class members here.
}
密封類別不能當做基類使用。 因此,它也不可以是抽象類。 密封類別可防止衍生。 因為它們永遠無法當做基類使用,所以某些運行時間優化可以稍微加快呼叫密封類別成員的速度。
在覆寫基類虛擬成員的衍生類別上,方法、索引器、屬性或事件可以將該成員宣告為密封。 這會否定成員的任何進一步衍生類別的虛擬層面。 這可藉由將 關鍵詞放在 sealed
類別成員宣告中的 override 關鍵詞之前來完成。 例如:
public class D : C
{
public sealed override void DoWork() { }
}