Qui ho un'evidenza differente:
Module Module1 Sub Main() Dim miaClasse As New Classe Dim secondaClasse As New Classe(2) Dim terzaClasse As New Classe(2, "ciao") Dim miaDerivata As New Derivata End Sub End Module Class Classe Sub New() Console.WriteLine("Costruttore senza parametri") Console.ReadKey() End Sub Sub New(ByVal parametro As Integer) Console.WriteLine("Costruttore con un parametro") Console.ReadKey() End Sub Sub New(ByVal parametro As Integer, ByVal parametro2 As String) Console.WriteLine("Costruttore con due parametri") Console.ReadKey() End Sub End Class Class Derivata Inherits Classe End ClassSe istanzio la classe derivata senza parametri, questa eredita il costruttore senza parametri della classe base.
Infatti l'output mi mostra il risultato dell'istanziazione della classe base mediante i suoi tre costruttori, e successivamente il risultato dell'istanziazione della classe derivata mediante il costruttore senza parametri della classe base, che quindi è necessariamente ereditato:
Costruttore senza parametri Costruttore con un parametro Costruttore con due parametri Costruttore senza parametri
Proviamo adesso ad aggiungere l'istanziazione della classe derivata mediante i costruttori con parametri:
Module Module1 Sub Main() Dim miaClasse As New Classe Dim secondaClasse As New Classe(2) Dim terzaClasse As New Classe(2, "ciao") Dim miaDerivata As New Derivata Dim secondaDerivata As New Derivata(2) Dim terzaDerivata As New Derivata(2, "ciao") End Sub End Module Class Classe Sub New() Console.WriteLine("Costruttore senza parametri") Console.ReadKey() End Sub Sub New(ByVal parametro As Integer) Console.WriteLine("Costruttore con un parametro") Console.ReadKey() End Sub Sub New(ByVal parametro As Integer, ByVal parametro2 As String) Console.WriteLine("Costruttore con due parametri") Console.ReadKey() End Sub End Class Class Derivata Inherits Classe End ClassEcco: ottengo l'errore già in fase di scrittura del codice.
Errore 1 Troppi argomenti per 'Public Sub New()'.
Errore 2 Troppi argomenti per 'Public Sub New()'.
Dunque la conclusione è che il costruttore senza parametri può essere ereditato, mentre i costruttori con parametri no.
Ma, come sospettavo, aggiungiamo i costruttori con parametri nel codice della classe derivata senza specificare il costruttore senza parametri, e ne vedremo delle belle:
Class Derivata Inherits Classe Sub New(ByVal parametro As Integer) Console.WriteLine("Costruttore con un parametro") Console.ReadKey() End Sub Sub New(ByVal parametro As Integer, ByVal parametro2 As String) Console.WriteLine("Costruttore con due parametri") Console.ReadKey() End SubE istanziamo:
Dim miaDerivata As New Derivata
Dim secondaDerivata As New Derivata(2)
Dim terzaDerivata As New Derivata(2, "ciao")
Ottengo un errore nell'istanziare la classe derivata col costruttore senza parametri:Errore 1 Risoluzione dell'overload non riuscita perché nessun 'New' accessibile accetta questo numero di argomenti.
Conclusione:
Se non esistono costruttori con parametri nella classe derivata, il costruttore di default (senza parametri) viene ereditato, mentre se esistono costruttori con parametri nella classe derivata, il costruttore di default va specificato espressamente!