Abstrakta och förseglade klasser och klassmedlemmar (C#-programmeringsguide)

Med det abstrakta nyckelordet kan du skapa klasser och klassmedlemmar som är ofullständiga och som måste implementeras i en härledd klass.

Med det förseglade nyckelordet kan du förhindra arv av en klass eller vissa klassmedlemmar som tidigare har markerats som virtuella.

Abstrakta klasser och klassmedlemmar

Klasser kan deklareras som abstrakta genom att nyckelordet abstract placeras före klassdefinitionen. Till exempel:

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

Det går inte att instansiera en abstrakt klass. Syftet med en abstrakt klass är att tillhandahålla en gemensam definition av en basklass som flera härledda klasser kan dela. Ett klassbibliotek kan till exempel definiera en abstrakt klass som används som en parameter för många av dess funktioner och kräva att programmerare som använder biblioteket tillhandahåller en egen implementering av klassen genom att skapa en härledd klass.

Abstrakta klasser kan också definiera abstrakta metoder. Detta görs genom att lägga till nyckelordet abstract före metodens returtyp. Till exempel:

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

Abstrakta metoder har ingen implementering, så metoddefinitionen följs av ett semikolon i stället för ett normalt metodblock. Härledda klasser i den abstrakta klassen måste implementera alla abstrakta metoder. När en abstrakt klass ärver en virtuell metod från en basklass kan den abstrakta klassen åsidosätta den virtuella metoden med en abstrakt metod. Till exempel:

// 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.
    }
}

Om en virtual metod deklareras abstractär den fortfarande virtuell för alla klasser som ärver från den abstrakta klassen. En klass som ärver en abstrakt metod kan inte komma åt den ursprungliga implementeringen av metoden. I föregående exempel DoWork kan klass F inte anropa DoWork klass D. På så sätt kan en abstrakt klass tvinga härledda klasser att tillhandahålla nya metodimplementeringar för virtuella metoder.

Förseglade klasser och klassmedlemmar

Klasser kan deklareras som förseglade genom att nyckelordet sealed placeras före klassdefinitionen. Till exempel:

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

En förseglad klass kan inte användas som basklass. Därför kan den inte heller vara en abstrakt klass. Förseglade klasser förhindrar härledning. Eftersom de aldrig kan användas som basklass kan vissa körningsoptimeringar göra det lite snabbare att anropa förseglade klassmedlemmar.

En metod, indexerare, egenskap eller händelse i en härledd klass som åsidosätter en virtuell medlem i basklassen kan deklarera medlemmen som förseglad. Detta negerar den virtuella aspekten av medlemmen för ytterligare härledda klasser. Detta görs genom att nyckelordet sealed sätts före nyckelordet åsidosättning i klassmedlemsdeklarationen. Till exempel:

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

Se även