抽象和密封類別以及類別成員 (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() { }
}

請參閱

工作

HOW TO:定義抽象屬性 (C# 程式設計手冊)

參考

類別和結構 (C# 程式設計手冊)

繼承 (C# 程式設計手冊)

方法 (C# 程式設計手冊)

欄位 (C# 程式設計手冊)

概念

C# 程式設計手冊