JavascriptProva

mercoledì 31 luglio 2013

Ereditarietà e overloading dei costruttori.

Si dice che i costruttori non vengono ereditati.
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 Class
Se 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 Class
Ecco: 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 Sub
E 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!

Nessun commento:

Posta un commento