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

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

0 голосов
/ 17 июня 2010

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

Например, в этом я всегда хочу постоянно обновлять myColor с любыми изменениями в любой или всех Red, Green или * 1006.* properties.

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) в каждую подпрограмму?

Ответы [ 3 ]

4 голосов
/ 17 июня 2010

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

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

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

2 голосов
/ 17 июня 2010

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

2 голосов
/ 17 июня 2010

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

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

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

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

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

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

...