Virtuale vs astratto
Virtuale e Astratto sono due parole chiave utilizzate nella maggior parte dei linguaggi di programmazione Object Oriented (OO) come Java e C #. Sebbene vi siano lievi differenze in ciò che significa in lingue diverse, sia le parole chiave virtuali che quelle astratte forniscono un senso di implementazione parziale alle entità che attribuisce a.
Astratto
In genere, le classi astratte, note anche come Abstract Base Classes (ABC), non possono essere istanziate (non è possibile creare un'istanza di quella classe). Quindi, le classi astratte hanno significato solo se il linguaggio di programmazione supporta l'ereditarietà (capacità di creare sottoclassi dall'estensione di una classe). Le classi astratte di solito rappresentano un concetto astratto o un'entità con un'implementazione parziale o nessuna. Pertanto, le classi Abstract agiscono come classi genitore da cui derivano le classi secondarie, in modo che la classe figlio condivida le funzionalità incomplete della classe genitore e la funzionalità possa essere aggiunta per completarle. Le classi astratte possono contenere metodi astratti. Sottoclassi che estendono una classe astratta possono implementare questi metodi astratti (ereditati). Se la classe bambino implementa tutti questi metodi astratti, è una classe concreta. Ma se così non fosse, anche la classe bambino diventerà una classe astratta. Ciò che significa tutto questo è che, quando il programmatore nomina una classe come Abstract, sta dicendo che la classe sarà incompleta e che avrà elementi che devono essere completati dalle sottoclassi ereditarie. Questo è un buon modo per creare un contratto tra due programmatori, che semplifica le attività nello sviluppo del software. Il programmatore, che scrive il codice da ereditare, deve seguire esattamente le definizioni del metodo (ma ovviamente può avere la propria implementazione). In Java e C #, classi e metodi astratti sono dichiarati usando la parola chiave Abstract.
Virtuale
I metodi / le funzioni virtuali forniscono la possibilità di sovrascrivere facoltativamente il proprio comportamento da una classe ereditaria (utilizzando una funzione con la stessa firma). Il concetto di funzione virtuale è importante nel seguente scenario. Supponiamo che una classe sia derivata da una classe figlia, quindi ogni volta che viene utilizzato un oggetto della classe derivata, può fare riferimento a un oggetto della classe base o della classe derivata. Ma, il comportamento della chiamata al metodo può essere ambiguo se i metodi della classe base sono sovrascritti. Quindi, per risolvere questa ambiguità, viene utilizzata la parola chiave virtuale. Se il metodo è contrassegnato come virtuale, viene chiamata la funzione della classe derivata (se presente) oppure viene chiamata la funzione della classe base. Ad esempio, in C ++, la parola chiave virtuale viene utilizzata esattamente per questo scopo. In C #, la parola chiave Virtual viene utilizzata in modo simile, ma in aggiunta, la parola chiave override deve essere utilizzata per modificare tutti i metodi sottoposti a override. Ma in Java, non esiste una parola chiave virtuale esplicita. Tutti i metodi non statici sono considerati virtuali. Le funzioni virtuali senza corpo sono chiamate pure funzioni virtuali. In Java e C #, i metodi astratti sono in effetti Pure Virtual.
Differenza tra virtuale e astratto
Sebbene Abstract e Virtual siano due parole chiave / concetti che forniscono un significato di implementazione incompleta alle entità associate, hanno le loro differenze. I metodi astratti (che devono essere definiti all'interno di classi astratte) non hanno affatto un'implementazione, mentre i metodi virtuali possono avere un'implementazione. Se i metodi astratti vengono estesi da una classe concreta, tutti i metodi astratti ereditati devono essere implementati, mentre i metodi virtuali ereditati possono essere sovrascritti o meno.