Esplorazione di metodi virtuali e astratti in C #

Il linguaggio di programmazione C # fornisce supporto per metodi virtuali e astratti, ognuno dei quali presenta vantaggi distinti. Si utilizzano metodi virtuali per implementare l'associazione tardiva, mentre i metodi astratti consentono di forzare le sottoclassi del tipo per eseguire l'override esplicito del metodo. In questo post presenterò una discussione sui metodi virtuali e astratti e su quando dovrebbero essere utilizzati.

Un metodo virtuale è quello dichiarato come virtuale nella classe base. Un metodo viene dichiarato virtuale specificando la parola chiave "virtual" nella firma del metodo. Un metodo virtuale può o non può avere un tipo restituito. I metodi virtuali consentono alle sottoclassi del tipo di sovrascrivere il metodo. Vengono utilizzati per implementare il polimorfismo in fase di esecuzione o l'associazione tardiva. Va notato che i membri virtuali o astratti di una classe non possono essere dichiarati privati. Inoltre, puoi avere un'implementazione in un metodo virtuale, cioè i metodi virtuali possono avere implementazioni al loro interno. Queste implementazioni possono essere sovrascritte dalle sottoclassi del tipo in cui è stato definito il metodo virtuale.

MSDN afferma: "La parola chiave virtuale viene utilizzata per modificare un metodo, una proprietà, un indicizzatore o una dichiarazione di evento e consentire l'override di esso in una classe derivata."

Analizziamo ora un po 'di codice per una maggiore chiarezza su come vengono utilizzati i metodi virtuali. Fare riferimento allo snippet di codice di seguito.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

Il metodo Test () viene dichiarato virtuale nella classe Base e viene sovrascritto nella classe Derived. Notare come la parola chiave virtual viene utilizzata per dichiarare il metodo come virtuale nella classe Base. La parola chiave virtual non è necessaria quando si sovrascrive il metodo virtuale nella classe Derived.

Fare ora riferimento allo snippet di codice fornito di seguito che illustra come vengono chiamati i metodi virtuali.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Notare che vengono create due istanze della classe Base: baseObj1 e baseObj2. Nel primo caso, l'oggetto di riferimento denominato baseObj1 fa riferimento a un'istanza della classe Base. Nel secondo caso, l'oggetto di riferimento denominato baseObj2 fa riferimento a un'istanza della classe Derived. Quando si esegue il codice, la prima chiamata al metodo virtuale visualizzerà il messaggio "Questa è la versione di base del metodo virtuale" nella console. Nel secondo caso, verrà visualizzato il messaggio "Questa è la versione derivata del metodo virtuale". Perché questa differenza?

Nel primo caso, viene considerato il tipo dell'oggetto di riferimento baseObj1 - poiché è di tipo Base, verrà chiamata la versione base del metodo virtuale. Nel secondo caso verrà considerato il contesto dell'oggetto di riferimento baseObj2 e quindi il risultato.

I metodi astratti sono quelli dichiarati astratti nella classe base e non possono avere implementazioni in essi, cioè non possono avere alcuna funzionalità in essi. È possibile utilizzare metodi astratti quando si desidera che il metodo venga sovrascritto con forza nelle classi derivate del tipo in cui è stato definito il metodo astratto. Questo viene applicato in fase di compilazione dal compilatore. Quindi, se hai dichiarato un metodo come astratto usando il modificatore astratto in una classe base, le sottoclassi di questa classe dovrebbero implementare il metodo astratto in mancanza del quale il compilatore visualizzerebbe un errore che indica che la classe derivata non ha implementato l'abstract membro. In sostanza,un metodo astratto viene dichiarato utilizzando la parola chiave abstract in una classe base astratta e le sottoclassi non astratte di questo tipo devono avere la propria implementazione del metodo abstract. Anche i metodi astratti sono implicitamente di natura virtuale, ma non è possibile utilizzare la parola chiave virtual quando si dichiara un metodo astratto. Va notato che i metodi astratti possono essere dichiarati solo all'interno di classi astratte.

Un utilizzo tipico di un metodo astratto è forzare l'override dei metodi ToString () o Equals (). Il frammento di codice seguente illustra come i metodi astratti vengono dichiarati in una classe astratta denominata EntityBase.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

La classe EntityBase è il tipo di base per tutte le entità: la classe entità Customer estende questa classe e fornisce l'implementazione per i metodi astratti. In sostanza, tutte le classi di entità fornirebbero la propria implementazione dei metodi ToString () ed Equals (). Nessuna implementazione predefinita per questi metodi è necessaria nella classe di base e quindi sono contrassegnati come astratti. Pertanto, l'override del metodo viene applicato dichiarando il metodo come astratto nella classe base denominata EntityBase.