Événements des classes
-
28-09-2019 - |
Question
Je trouve que j'écris beaucoup de code dans mes cours pour maintenir les propriétés en phase les uns avec les autres. J'ai lu sur les événements des classes, mais n'ont pas été en mesure d'envelopper ma tête autour de la façon de les faire travailler pour ce que je suis à la recherche. Je pourrais utiliser quelques conseils ici.
Par exemple, dans ce que je veux toujours garder myColor
à jour avec tout changement que ce soit dans un ou plusieurs des propriétés Red
, Green
ou 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
Si un ou plusieurs de ces changements, je veux myColor
être mis à jour. Assez facile comme ci-dessus, mais est-il un moyen de travailler avec des événements qui fera automatiquement, donc je ne dois pas mettre myColor = Color.FromArgb(Red, Green, Blue)
dans chaque sous-routine?
La solution
Dans vos événements de cas ne sont pas utiles.
Les événements sont utilisés comme un moyen pour le code des autres pour agir sur votre code. Vous feriez un événement pour que vous puissiez dire au monde quelque chose que votre code est en train de faire. Vous pouvez faire un événement pour la couleur a changé que vous pouvez augmenter chaque fois que la couleur change en someway, mais ce ne serait pas à votre avantage et serait tout simplement utilisé par un autre morceau de code qui utilise votre classe et veut faire quelque chose quand la couleur est modifiée.
Les événements sont pour le code à l'extérieur, et non pour la gestion de classe interne. En tant que personne avant moi, le problème que vous rencontrez est plus d'un problème d'encapsulation, vous pouvez résoudre 2 façons:
1) Mise à jour variable interne chaque fois que quelque chose est changé comme vous faites. Mais je suggère faire une fonction privée interne appelée ColorChanged () qui recalcule la couleur comme vous faites. Je dis faire fonction parce que plus tard sur la route si vous voulez plus logique lorsque la couleur est modifiée, vous ne seriez pas à vous soucier de changer dans ce 3 endroits.
2) Mise à jour lorsque la couleur quand il est requsted (comme la personne devant moi). Faire une propriété qui calcule la couleur à chaque fois qu'il est accessible. Ceci est le plus simple et fonctionne dans la plupart des cas parfait. Mais si vous utilisez cette propriété BEAUCOUP alors tous ces recaclculations pourrait être un problème de performance (dans ce cas, le calcul de la couleur n'est pas très intense donc il n'a pas d'importance).
Dans ce cas, je ferais l'option 2 par souci de simplicité malgré l'inconvénient minuscule performance ... et je veux dire tout petit inconvénient ... la performance
Autres conseils
Dans ce scénario pourquoi ne pas vous changer votre propriété myColor être ceci:
Private ReadOnly Property myColor As Color
Begin Get
Return Color.FromArgb(Red, Green, Blue)
End Get
End Property
De cette façon, il sera toujours en phase.
Je abolirait les variables de classe pour le rouge, vert et bleu, et tout simplement la poignée d'objets de couleur toutes les valeurs. Vous pouvez appeler myColor.R ou .G, ou .B pour obtenir le composant que vous voulez si vous voulez lire les valeurs plus tard. L'objet myColor stocke déjà R, G et B, donc pas de point à dupliquer les informations.