События в классах
-
28-09-2019 - |
Вопрос
Я считаю, что я пишу много кода в моем классах, чтобы сохранить свойства синхронизации друг с другом. Я читал о событиях в классах, но не смогли обернуть голову, как заставить их работать на то, что я ищу. Я мог бы использовать несколько советов здесь.
Например, в этом я всегда хочу сохранить myColor
в курсе любых изменений в любом или всем или всем Red
, Green
или 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
Если один или несколько из этих изменений, я хочу myColor
быть обновленным. Достаточно легко, как указано выше, но есть ли способ работать с событиями, которые автоматически сделают это, поэтому мне не нужно ставить myColor = Color.FromArgb(Red, Green, Blue)
в каждой подписке?
Решение
В ваших случаях события не полезны.
События используются в качестве пути для того, чтобы другие люди действовали на ваш код. Вы бы сделали событие, чтобы вы могли сказать миру о чем-то, что делает ваш код. Вы можете сделать событие для измененного цвета, что вы можете поднять каждый раз, когда цвет немного изменен, но это не будет для вашей выгоды и будет просто использоваться любой другой кусочкой кода, который использует ваш класс и хочет что-то сделать, когда Цвет изменен.
События для внешнего кода, а не для управления внутренним классом. Поскольку человек, прежде чем мне сказал, проблема, у вас есть больше проблема инкапсуляции, вы можете решить 2 способа:
1) Обновить внутреннюю переменную каждый раз, когда что-то изменилось, как вы делаете. Но я предлагаю сделать внутреннюю личную функцию, называемую ColorChanged (), которая пересчитается, как вы делаете. Я говорю, делаю функцию, потому что позже вниз по дороге, если вы хотите больше логики, когда цвет изменен, вам не придется беспокоиться о том, чтобы изменить его в 3 места.
2) Обновить, когда цвет, когда он будет возвращен (как человек до меня). Сделайте свойство, которое рассчитывает цвет каждый раз, когда он доступен. Это самый простой и в большинстве случаев работает идеально. Но если вы используете это свойство многое, то все эти рекаклаты могут быть проблемой производительности (в этом случае вычисление цвета не очень интенсивно, поэтому не имеет значения).
В этом случае я бы сделал вариант 2 ради простоты, несмотря на крошечный недостаток производительности ... И я имею в виду крошечный недостаток производительности ...
Другие советы
В этом сценарии почему бы вы не изменили свой свойство MyColor, чтобы быть так:
Private ReadOnly Property myColor As Color
Begin Get
Return Color.FromArgb(Red, Green, Blue)
End Get
End Property
Таким образом, он всегда будет в синхронизации.
Я бы поработал с переменными классами для красного, зеленого и синего и синего и просто иметь цветной объект, обрабатывая все значения. Вы можете позвонить MyColor.r, или .g, или .b Чтобы получить компонент, который вы хотите, если вы хотите прочитать значения позже. Объект MyColor уже хранит R, G и B, так что нет дублирования информации.