È meglio utilizzare le proprietà nella classe figlio per accedere al genitore o renderlo pubblico?
-
19-08-2019 - |
Domanda
Ho 2 classi, un genitore e un figlio.
Class Test
Private Test_Text
Private Sub Class_Initialize()
Test_Text = "Hello"
End Sub
Private Sub Class_Terminate()
End Sub
Public Property Get Text
Text = Test_Text
End Property
Public Property Let Text(ByVal strIn)
Test_Text = strIn
End Property
End Class
Class SubTest
Public SubTest_Test
Private SubTest_Interger
Private Sub Class_Initialize()
Set SubTest_Test = New Test
End Sub
Private Sub Class_Terminate()
Set SubTest_Test = Nothing
End Sub
Public Property Get int
int = SubTest_Integer
End Property
Public Property Let int(ByVal intIn)
SubTest_Integer = intIn
End Property
End Class
Poiché ho reso pubblico SubTest_Test, posso accedervi attraverso la classe figlio come questa
Set MyTest = New SubTest
MsgBox MyTest.SubTest_Test.Text
È accettabile o devo rendere SubTest_Test privato e scrivere proprietà nella classe figlio per accedere alle proprietà dei genitori?
Modifica: suppongo che la domanda avrebbe dovuto essere, ci sono problemi di sicurezza / usabilità con l'accesso diretto al genitore.
Più ci penso e più ci penso dal punto di vista dell'usabilità, è meglio nascondere il genitore a chiunque usi la classe figlio. In questo modo quando crei un oggetto dalla classe figlio, non devi sapere nulla della classe genitore.
Soluzione
no - ciò viola la Law of Demeter ; ripensare l'interfaccia - in quali circostanze qualcuno dovrebbe accedere alla proprietà Text dell'oggetto Test incluso in un oggetto SubTest? Se queste situazioni hanno senso, devi esporre Text come proprietà in SubTest.
Dati i nomi che mi sarei aspettato che SubTest ereditasse da Test e quindi esponesse automaticamente la proprietà Text, ma per fortuna ho dimenticato VBSCRIPT, quindi non ricordo se supporta anche l'ereditarietà ;-)
Altri suggerimenti
Dato che questa è una relazione HAS-A
tra le tue due classi, penso che dovresti lasciarla così com'è. Non è necessario introdurre codice incapsulante per qualcosa che non ne ha bisogno.
Ecco un esempio di pseudo-codice:
class Engine
[method] start()
class Car
[property] Engine
Idealmente dovresti fare riferimento a Engine
come proprietà di Car
in questo modo:
Car.Engine.start()
L'alternativa sarebbe scrivere codice extra in Car
per racchiudere i metodi in Engine
. Anche se puoi farlo, non ha molto senso in quanto dovrai semplicemente scrivere metodi pass-through da Auto
a Engine
.
Direi che dipende dal numero di proprietà che vuoi esporre. Ma l'incapsulamento è sempre una buona regola da seguire. Se Text è l'unica proprietà a cui accederai, molto probabilmente renderei SubTest_Test privato e racchiuderei la proprietà.