Вопрос

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

Например, в этом я всегда хочу сохранить 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, так что нет дублирования информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top