События в классах

Я обнаружил, что пишу много кода в своих классах, чтобы синхронизировать свойства друг с другом. Я читал о событиях в классах, но не смог понять, как заставить их работать для того, что я ищу. Я мог бы использовать некоторые советы здесь.

Например, в этом я всегда хочу держать 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) в каждую подпрограмму?


person Todd Main    schedule 17.06.2010    source источник


Ответы (3)


В вашем случае события бесполезны.

События используются для того, чтобы код других людей воздействовал на ваш код. Вы бы сделали событие, чтобы рассказать миру о том, что делает ваш код. Вы можете создать событие для изменения цвета, которое вы могли бы вызывать каждый раз, когда цвет каким-либо образом изменяется, но это не будет в ваших интересах и будет просто использоваться любым другим фрагментом кода, который использует ваш класс и хочет что-то сделать, когда цвет изменен.

События предназначены для внешнего кода, а не для внутреннего управления классом. Как сказал человек до меня, проблема, с которой вы столкнулись, больше связана с проблемой инкапсуляции, которую вы можете решить двумя способами:

1) Обновляйте внутреннюю переменную каждый раз, когда что-то изменяется, как вы делаете. Но я предлагаю создать внутреннюю приватную функцию ColorChanged(), которая будет пересчитывать цвет, как вы это делаете. Я говорю сделать функцию, потому что позже, если вам понадобится больше логики при изменении цвета, вам не придется беспокоиться об изменении его в 3-х местах.

2) Обновите цвет, когда он запрашивается (как человек до меня). Создайте свойство, которое вычисляет цвет при каждом обращении к нему. Это самый простой и в большинстве случаев работает идеально. Но если вы используете это свойство МНОГО, то все эти пересчеты могут быть проблемой производительности (в этом случае вычисление цвета не очень интенсивно, поэтому это не имеет значения).

В этом случае я бы сделал вариант 2 для простоты, несмотря на крошечный недостаток производительности... и я имею в виду крошечный недостаток производительности...

person Bob Fincheimer    schedule 17.06.2010

В этом сценарии, почему бы вам не изменить свойство myColor следующим образом:

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

Таким образом, он всегда будет синхронизирован.

person brendan    schedule 17.06.2010
comment
Бренден, я очень ценю ответ. Боб дал гораздо больше подробностей о том, почему я не должен рассматривать события, поэтому я приму его ответ, но определенно +1 вам! - person Todd Main; 17.06.2010

Я бы отказался от переменных класса для красных, зеленых и синих цветов и просто использовал объект цвета для обработки всех значений. Вы можете вызвать myColor.R, или .G, или .B, чтобы получить нужный компонент, если вы хотите прочитать значения позже. Объект myColor уже хранит R, G и B, поэтому нет смысла дублировать информацию.

person Kibbee    schedule 17.06.2010