抽象和密封類別以及類別成員 (C# 程式設計手冊)
abstract 關鍵字可讓您建立類別和類別成員,這些類別和成員並不完整,因此必須在衍生類別 (Derived Class) 中實作。
sealed 關鍵字可讓您避免繼承先前標記為 virtual 的類別或特定類別成員。
抽象類別和類別成員
在類別定義前面加入 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,對於繼承自抽象類別 (Abstract Class) 的任何類別來說,這個方法仍為虛擬。 繼承抽象方法的類別不可存取方法的原始實作,在前面的範例中,F 類別上的 DoWork 不可呼叫 D 類別上的 DoWork。 如此一來,抽象類別就能強制衍生類別為虛擬方法提供新的方法實作。
密封類別和類別成員
在類別定義前面加入 sealed 關鍵字,就可以將類別宣告為 sealed。 例如:
public sealed class D
{
// Class members here.
}
密封類別不能當做基底類別使用。 因此,這種類別也不能是抽象類別。 密封類別可以避免發生衍生。 由於密封類別永遠不能當做基底類別使用,因此某些執行階段最佳化呼叫密封類別成員的速度會稍快。
若類別成員、方法、欄位、屬性或事件是位於覆寫基底類別虛擬成員的衍生類別上,則可宣告為密封。 如此一來,若接下來衍生任何類別,成員都不再是虛擬的。 只要在類別成員宣告中將 sealed 關鍵字放在 override 關鍵字前面,即可完成此動作。 例如:
public class D : C
{
public sealed override void DoWork() { }
}