JavascriptProva

lunedì 29 luglio 2013

Ereditarietà, visibilità di membri Private, Protected e Public dalle classi derivate.

Ereditiamo...

Questa è la classe base:
Class miaClasse
    Private nome As Int32 = 444
    Private Property proprieta() As Int32
        Get
            Return nome
        End Get

        Set(ByVal value As Int32)
            nome = value
        End Set
    End Property

    Sub propertySetting(ByVal valore As Int32)
        proprieta = valore
    End Sub

    Sub metodo()
        MsgBox(proprieta)
    End Sub

End Class


E creo una classe derivata:
Class miaClasseDerivata
    Inherits miaClasse
    Sub altroMetodo()
        MsgBox("Io sono una classe derivata e questa è la mia proprietà " & proprieta)
    End Sub
End Class
Bene: ottengo un errore che mi viene notificato dall'IDE già in fase di scrittura del codice: Errore 1 'WindowsApplication1.miaClasse.Private Property proprieta As Integer' non è accessibile in questo contesto perché è 'Private'. C:\Users\Antonello\documents\visual studio 2010\Projects\WindowsApplication1\WindowsApplication1\Form1.vb 37 77 WindowsApplication1

Questo perchè il metodo della classe derivata non può accedere a una proprietà Private della classe madre.

Però, pur nella classe derivata, il metodo ereditato dalla classe madre può accedere a un membro Private.

Istanziando la classe derivata e chiamando un metodo ereditato dalla classe madre, questo metodo può mostrare tranquillamente in una MessageBox il valore della proprietà Private.
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim questaClasse As New miaClasseDerivata
        questaClasse.metodo()
        questaClasse.metodo()

        
    End Sub


Tutto questo va tenuto bene in mente.
Adesso faccio in modo che il metodo della classe derivata possa avere accesso alla proprietà, dichiarandola Protected:
Class miaClasse
    Private nome As Int32 = 444
    Protected Property proprieta() As Int32
        Get
            Return nome
        End Get

        Set(ByVal value As Int32)
            nome = value
        End Set
    End Property

    Sub propertySetting(ByVal valore As Int32)
        proprieta = valore
    End Sub

    Sub metodo()
        MsgBox(proprieta)
    End Sub

    
End Class

Class miaClasseDerivata
    Inherits miaClasse
    Sub altroMetodo()
        MsgBox(proprieta)
    End Sub
End Class
Non ottengo errori in fase di scrittura del codice...
...e istanziando in questo modo:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim questaClasse As New miaClasseDerivata
        questaClasse.altroMetodo()
    End Sub
...ottengo una MessageBox con il valore della proprietà ereditata dalla classe madre!
Con la proprietà Public il problema, ovviamente, non si pone:
Class miaClasse
    Private nome As Int32 = 444
    Public Property proprieta() As Int32
        Get
            Return nome
        End Get

        Set(ByVal value As Int32)
            nome = value
        End Set
    End Property

    Sub propertySetting(ByVal valore As Int32)
        proprieta = valore
    End Sub

    Sub metodo()
        MsgBox(proprieta)
    End Sub

    
End Class

Class miaClasseDerivata
    Inherits miaClasse
    Sub altroMetodo()
        MsgBox(proprieta)
    End Sub
End Class

Nessun commento:

Posta un commento