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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top