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 ClassBene: 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 ClassNon 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