Domanda

Trovo che scrivo un sacco di codice all'interno mie classi per mantenere le proprietà in sincronia con l'altro. Ho letto su eventi nelle classi, ma non sono stati in grado di avvolgere la mia testa intorno come farli lavorare per quello che sto cercando. Potrei usare qualche consiglio qui.

Per esempio, in questo ho sempre voglia di tenere myColor aggiornati con qualunque modifica in qualsiasi o tutte le proprietà Red, Green o Blue.

Class myColors
    Private Property Red As Byte
    Private Property Green As Byte
    Private Property Blue As Byte
    Private Property myColor As Color
    Sub New()
        myColor = Color.FromArgb(0, 0, 0)
    End Sub
    Sub ChangeRed(ByVal r As Byte)
        Red = r
        myColor = Color.FromArgb(Red, Green, Blue)
    End Sub
    Sub ChangeBlue(ByVal b As Byte)
        Blue = b
        myColor = Color.FromArgb(Red, Green, Blue)
    End Sub
End Class

Se uno o più di questi cambiamenti, voglio myColor da aggiornare. Abbastanza facile come sopra, ma c'è un modo di lavorare con gli eventi che avrebbero automaticamente fare questo in modo non devo mettere myColor = Color.FromArgb(Red, Green, Blue) in ogni sub routine?

È stato utile?

Soluzione

Nel caso gli eventi non sono utili.

Gli eventi sono usati come un modo per il codice di altre persone ad agire sul codice. Si potrebbe fare un evento in modo che si possa raccontare al mondo qualcosa che il tuo codice sta facendo. Si potrebbe fare un evento per il colore cambiato che si può alzare ogni volta che il colore è cambiato in qualche modo, ma questo non sarebbe per il vostro beneficio e sarebbe semplicemente utilizzato da qualsiasi altro pezzo di codice che utilizza la classe e vuole fare qualcosa quando il colore è cambiato.

Gli eventi sono per il codice di fuori, non per la gestione della classe interna. Come la persona prima di me ha detto, il problema si stanno avendo è più di un problema incapsulamento è possibile risolvere 2 modi:

1) Aggiornamento variabile interna ogni volta che qualcosa è cambiato, come si sta facendo. Ma Suggerisco di fare una funzione privata interna chiamata ColorChanged () che sarà ricalcolare il colore come si sta facendo. Dico fare una funzione perché più tardi lungo la strada se si voleva più logica quando il colore è cambiato, si avrebbe non c'è bisogno di preoccuparsi di cambiare in 3 posti.

2) Aggiornamento quando il colore quando viene requsted (come la persona prima di me). Fare una proprietà che calcola il colore ogni volta che vi si accede. Questo è il più semplice e nella maggior parte dei casi funziona perfettamente. Ma se si utilizza la proprietà MOLTO poi tutte quelle recaclculations potrebbe essere un problema di prestazioni (in questo caso il calcolo del colore non è molto intensa in modo che non importa).

In questo caso vorrei fare l'opzione 2 per semplicità, nonostante il piccolo svantaggio prestazioni ... e intendo minuscola prestazioni svantaggio ...

Altri suggerimenti

In questo scenario perché non si cambia la vostra proprietà myColor essere questo:

Private ReadOnly Property myColor As Color
  Begin Get
    Return Color.FromArgb(Red, Green, Blue)
  End Get
End Property

In questo modo sarà sempre in sincronia.

Vorrei farla finita con le variabili di classe per il rosso, verde e blu, e semplicemente la maniglia oggetto di colore tutti i valori. È possibile chiamare myColor.R, o .G, o .B per ottenere il componente che si desidera, se si desidera leggere i valori in seguito. L'oggetto myColor già esercizi R, G e B, così inutile duplicare le informazioni.

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