In Visual Basic .NET, l'ereditarietà è implementata utilizzando la parola chiave Inherits. Permette di creare gerarchie di classi che implementano metodi e proprietà comuni e sovrascrivibili.
Per supportare il polimorfismo, i metodi nella classe base vengono dichiarati con il modificatore Overridable, mentre nella classe derivata vengono sovrascritti con Overrides. Per prevenire ulteriori sovrascritture, viene utilizzato il modificatore NotOverridable.
Esempio:
' Classe base Animal con un metodo virtuale Public Class Animal Public Overridable Sub Speak() Console.WriteLine("L'animale emette un suono.") End Sub End Class ' Derivato Dog sovrascrive Speak Public Class Dog Inherits Animal Public Overrides Sub Speak() Console.WriteLine("Il cane abbaia.") End Sub End Class Sub Main() Dim a As Animal = New Dog() a.Speak() ' Restituisce: Il cane abbaia. End Sub
D: È possibile in Visual Basic .NET sovrascrivere metodi non dichiarati come Overridable/Abstract nella classe base?
R: No. Solo i metodi contrassegnati come Overridable o dichiarati tramite interfaccia/astrazione possono essere sovrascritti nell'ereditarietà. Tentare di utilizzare Overrides per un metodo normale genererà un errore di compilazione.
' Errore: Public Class A Public Sub Foo() End Sub End Class Public Class B Inherits A Public Overrides Sub Foo() ' Errore di compilazione End Sub End Class
Storia
1. In un progetto reale, legato a un'architettura a microservizi, un nuovo membro del team ha dichiarato un metodo virtuale come normale (senza Overridable) nella classe base del controller. In seguito, un altro sviluppatore ha cercato di sovrascrivere questo metodo per una gestione speciale. Di conseguenza, si sono creati duplicati di logica e bug, poiché l'implementazione parentale veniva sempre chiamata, nonostante fosse presente il metodo nella derivata.
Storia
2. Un'architettura insufficientemente elaborata e la mancanza di utilizzo del polimorfismo hanno portato a centinaia di righe di codice ridondante: quando è stato necessario aggiungere un nuovo discendente, è stato necessario riscrivere gran parte del metodo della classe base, piuttosto che semplicemente implementare il necessario Override. Questo ha complicato il supporto e la manutenzione.
Storia
**3. Caso di un'applicazione aziendale: durante la migrazione a .NET Core, uno sviluppatore ha contrassegnato un metodo come Overridable, ma per errore non ha aggiunto Implements dell'interfaccia. Di conseguenza, è stata riscontrata un'ambiguità nella risoluzione dei metodi nella gerarchia di ereditarietà e si sono presentati problemi quando si chiamava tramite riferimento all'interfaccia, il che ha portato a funzionalità non funzionanti.