Classi e membri delle classi astratte e sealed (Guida per programmatori C#)Abstract and Sealed Classes and Class Members (C# Programming Guide)

La parola chiave abstract consente di creare classi e membri di classe, che sono incompleti e devono essere implementati in una classe derivata.The abstract keyword enables you to create classes and class members that are incomplete and must be implemented in a derived class.

La parola chiave sealed consente di impedire l'ereditarietà di una classe o di determinati membri di classe contrassegnati in precedenza come virtuali.The sealed keyword enables you to prevent the inheritance of a class or certain class members that were previously marked virtual.

Classi e membri di classi astratteAbstract Classes and Class Members

Una classe può essere dichiarata astratta inserendo la parola chiave abstract prima della definizione della classe.Classes can be declared as abstract by putting the keyword abstract before the class definition. Ad esempio:For example:

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

Non è possibile creare un'istanza di una classe astratta.An abstract class cannot be instantiated. Lo scopo di una classe astratta è quello di fornire una definizione comune di una classe base condivisibile da più classi derivate.The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share. 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.For example, a class library may define an abstract class that is used as a parameter to many of its functions, and require programmers using that library to provide their own implementation of the class by creating a derived class.

Le classi astratte possono inoltre definire metodi astrattiAbstract classes may also define abstract methods. aggiungendo la parola chiave abstract prima del tipo restituito del metodo.This is accomplished by adding the keyword abstract before the return type of the method. Ad esempio:For example:

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

I metodi astratti non prevedono implementazione, pertanto la definizione del metodo è seguita da un punto e virgola, anziché da un normale blocco di metodi.Abstract methods have no implementation, so the method definition is followed by a semicolon instead of a normal method block. Le classi derivate della classe astratta devono implementare tutti i metodi astratti.Derived classes of the abstract class must implement all abstract methods. 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.When an abstract class inherits a virtual method from a base class, the abstract class can override the virtual method with an abstract method. Ad esempio:For example:

// 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.If a virtual method is declared abstract, it is still virtual to any class inheriting from the abstract class. Una classe che eredita un metodo astratto non può accedere all'implementazione originale del metodo. Nell'esempio precedente, DoWork sulla classe F non può chiamare DoWork sulla classe D. In questo modo una classe astratta può imporre alle classi derivate di fornire nuove implementazioni per i metodi virtuali.A class inheriting an abstract method cannot access the original implementation of the method—in the previous example, DoWork on class F cannot call DoWork on class D. In this way, an abstract class can force derived classes to provide new method implementations for virtual methods.

Classi e membri di classi sealedSealed Classes and Class Members

Le classi possono essere dichiarate sealed inserendo la parola chiave sealed prima della definizione della classe.Classes can be declared as sealed by putting the keyword sealed before the class definition. Ad esempio:For example:

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

Una classe sealed non può essere utilizzata come classe base.A sealed class cannot be used as a base class. Per questo motivo non può neppure essere una classe astratta.For this reason, it cannot also be an abstract class. Le classi sealed impediscono la derivazione.Sealed classes prevent derivation. Poiché non possono mai essere utilizzate come classe base, in alcune ottimizzazioni runtime la chiamata ai membri di classi sealed può risultare leggermente più rapida.Because they can never be used as a base class, some run-time optimizations can make calling sealed class members slightly faster.

Un metodo, un indicizzatore, una proprietà o un evento di una classe derivata che esegue l'override di un membro virtuale della classe base può dichiarare tale membro come sealed.A method, indexer, property, or event, on a derived class that is overriding a virtual member of the base class can declare that member as sealed. In questo modo viene negato l'aspetto virtuale del membro per qualsiasi ulteriore classe derivata.This negates the virtual aspect of the member for any further derived class. A questo scopo è necessario inserire la parola chiave sealed prima della parola chiave override nella dichiarazione del membro di classe.This is accomplished by putting the sealed keyword before the override keyword in the class member declaration. Ad esempio:For example:

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

Vedere ancheSee also