È meglio utilizzare le proprietà nella classe figlio per accedere al genitore o renderlo pubblico?

StackOverflow https://stackoverflow.com/questions/459326

  •  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.

È stato utile?

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top