Klasy abstrakcyjne i zapieczętowane oraz członkowie klas (Przewodnik programowania w języku C#)

Słowo kluczowe abstrakcyjne umożliwia tworzenie klas i składowych klas, które są niekompletne i muszą być implementowane w klasie pochodnej.

Zapieczętowane słowo kluczowe umożliwia zapobieganie dziedziczeniu klasy lub niektórych elementów członkowskich klasy, które zostały wcześniej oznaczone jako wirtualne.

Klasy abstrakcyjne i składowe klas

Klasy można zadeklarować jako abstrakcyjne, umieszczając słowo kluczowe abstract przed definicją klasy. Na przykład:

public abstract class A
{
    // Class members here.
}

Nie można utworzyć wystąpienia klasy abstrakcyjnej. Celem klasy abstrakcyjnej jest zapewnienie wspólnej definicji klasy bazowej, którą może współdzielić wiele klas pochodnych. Na przykład biblioteka klas może zdefiniować abstrakcyjną klasę, która jest używana jako parametr dla wielu jej funkcji, i wymagać od programistów używania tej biblioteki do zapewnienia własnej implementacji klasy przez utworzenie klasy pochodnej.

Klasy abstrakcyjne mogą również definiować metody abstrakcyjne. Jest to realizowane przez dodanie słowa kluczowego abstract przed typem zwrotnym metody. Na przykład:

public abstract class A
{
    public abstract void DoWork(int i);
}

Metody abstrakcyjne nie mają implementacji, więc po definicji metody następuje średnik zamiast normalnego bloku metody. Klasy pochodne klasy abstrakcyjnej muszą implementować wszystkie metody abstrakcyjne. Gdy klasa abstrakcyjna dziedziczy metodę wirtualną z klasy bazowej, klasa abstrakcyjna może zastąpić metodę wirtualną metodą abstrakcyjną. Na przykład:

// 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 Jeśli metoda jest zadeklarowanaabstract, nadal jest wirtualna dla dowolnej klasy dziedziczonej z klasy abstrakcyjnej. Klasa dziedzicząca metodę abstrakcyjną nie może uzyskać dostępu do oryginalnej implementacji metody — w poprzednim przykładzie DoWork klasa F nie może wywołać DoWork klasy D. W ten sposób klasa abstrakcyjna może wymusić klasy pochodne, aby zapewnić nowe implementacje metod wirtualnych.

Zapieczętowane klasy i składowe klas

Klasy można zadeklarować jako zapieczętowane przez umieszczenie słowa kluczowego sealed przed definicją klasy. Na przykład:

public sealed class D
{
    // Class members here.
}

Zapieczętowanej klasy nie można używać jako klasy bazowej. Z tego powodu nie może być również klasą abstrakcyjną. Zapieczętowane klasy uniemożliwiają wyprowadzanie. Ponieważ nigdy nie można ich używać jako klasy bazowej, niektóre optymalizacje czasu wykonywania mogą sprawić, że wywołanie zapieczętowanych składowych klasy jest nieco szybsze.

Metoda, indeksator, właściwość lub zdarzenie w klasie pochodnej, która zastępuje wirtualny element członkowski klasy bazowej, może zadeklarować ten element członkowski jako zapieczętowany. Spowoduje to negację wirtualnego aspektu składowej dla dalszej klasy pochodnej. Jest to realizowane przez umieszczenie słowa kluczowego sealed przed zastąpieniem słowa kluczowego w deklaracji składowej klasy. Na przykład:

public class D : C
{
    public sealed override void DoWork() { }
}

Zobacz też