Classi e membri delle classi astratte e sealed (Guida per programmatori C#)

La parola chiave abstract consente di creare classi e membri di una classe incompleti che devono essere implementati in una classe derivata.

La parola chiave sealed consente di impedire l'ereditarietà di una classe o di determinati membri di classi in precedenza contrassegnati come virtuali.

Classi e membri delle classi astratte

Una classe può essere dichiarata come astratta inserendo la parola chiave abstract prima della definizione della classe. Esempio:

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

Non è possibile creare un'istanza di una classe astratta. Scopo di una classe astratta è di fornire una definizione comune di una classe base condivisibile da più classi derivate. Una libreria di classi può, ad esempio, definire una classe astratta utilizzata come parametro per molte funzioni e richiedere ai programmatori che utilizzano tale libreria di fornire un'implementazione personalizzata della classe creando una classe derivata.

Le classi astratte possono inoltre definire metodi astratti aggiungendo la parola chiave abstract prima del tipo restituito del metodo. Esempio:

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

I metodi astratti non prevedono implementazione, quindi la definizione del metodo è seguita da un punto e virgola, anziché da un normale blocco di metodi. Le classi derivate della classe astratta devono implementare tutti i metodi astratti. Quando una classe astratta eredita un metodo virtuale da una classe base, la classe astratta può eseguire l'override del metodo virtuale con un metodo astratto. Esempio:

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

Un metodo virtual dichiarato abstract, rimane virtuale in qualsiasi classe che eredita dalla classe astratta. Una classe che eredita un metodo astratto non può accedere all'implementazione originale del metodo. Nell'esempio precedente, DoWork della classe F non può chiamare DoWork della classe D. In questo modo una classe astratta può imporre alle classi derivate di fornire nuove implementazioni per i metodi virtuali.

Classi e membri delle classi sealed

Una classe può essere dichiarata come sealed inserendo la parola chiave sealed prima della definizione della classe. Esempio:

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

Una classe sealed non può essere utilizzata come classe base. Per questo motivo non può neanche essere una classe astratta. Le classi sealed impediscono la derivazione. Poiché non possono mai essere utilizzate come classe base, in alcune ottimizzazioni in fase di esecuzione la chiamata ai membri delle classi sealed può risultare leggermente più rapida.

Un membro, un metodo, un campo, una proprietà o un evento di una classe derivata che esegue l'override di un membro virtuale della classe base può dichiarare questo membro come sealed. In questo modo viene negato l'aspetto virtuale del membro per qualsiasi ulteriore classe derivata. A questo scopo è necessario inserire la parola chiave sealed prima della parola chiave override nella dichiarazione del membro della classe. Esempio:

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

Vedere anche

Attività

Procedura: definire proprietà astratte (Guida per programmatori C#)

Riferimenti

Classi e struct (Guida per programmatori C#)

Ereditarietà (Guida per programmatori C#)

Metodi (Guida per programmatori C#)

Campi (Guida per programmatori C#)

Concetti

Guida per programmatori C#