Eventos de las clases
-
28-09-2019 - |
Pregunta
Me parece que escribo una gran cantidad de código dentro de mis clases para mantener las propiedades en sincronía con los demás. He leído acerca de los eventos de las clases, pero no han sido capaces de envolver mi cabeza alrededor de cómo hacer que funcionen para lo que estoy buscando. Yo podría utilizar algunos consejos aquí.
Por ejemplo, en éste Siempre quiero seguir myColor
al corriente de cualquier cambio alguno en cualquiera o todas las propiedades Red
, Green
o 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 uno o más de esos cambios, quiero myColor
a ser actualizada. Es bastante fácil que el anterior, pero hay una manera de trabajar con eventos que hará automáticamente, así que no tengo que poner myColor = Color.FromArgb(Red, Green, Blue)
en todos los sub-rutina?
Solución
En sus eventos de casos no son útiles.
Los eventos se utilizan como una forma de código de otras personas que actúen por su código. Se podría hacer un evento para que usted podría decirle al mundo acerca de algo que su código está haciendo. Se podría hacer un evento para el color cambió que se podía levantar cada vez que se cambia el color de alguna manera, pero esto no sería para su beneficio y se utilizaría simplemente por cualquier otra pieza de código que utiliza su clase y quiere hacer algo cuando el color se cambia.
Los eventos son de código fuera, no para la gestión interna de clase. A medida que la persona delante de mí, dijo, el problema que está teniendo es más una cuestión de encapsulación se puede resolver de 2 maneras:
1) Actualización de variable interna cada vez que algo se cambia al igual que está haciendo. Pero sugiero hacer una función privada interna llamada ColorChanged () que se vuelva a calcular el color como usted está haciendo. Yo digo que una función porque más adelante en el camino si quieres más lógica cuando se cambia el color, usted no tiene que preocuparse acerca de cambiar en 3 lugares.
2) Actualización cuando el color cuando se requsted (como la persona antes que yo). Hacer que una propiedad que calcula el color cada vez que se accede a ella. Este es el más simple y en la mayoría de los casos funciona perfecto. Pero si se utiliza esa propiedad mucho, entonces todos esos recaclculations podría ser un problema de rendimiento (en este caso el cálculo del color no es muy intenso por lo que no importa).
En este caso me gustaría hacer la opción 2 por motivos de simplicidad a pesar del pequeño inconveniente rendimiento ... y me refiero pequeña rendimiento inconveniente ...
Otros consejos
En este escenario ¿por qué no cambia su propiedad myColor ser la siguiente:
Private ReadOnly Property myColor As Color
Begin Get
Return Color.FromArgb(Red, Green, Blue)
End Get
End Property
De esta manera será siempre en sincronía.
Me acabaría con las variables de clase para el rojo, verde y azul, y simplemente tener el controlador de objetos de color todos los valores. Puede llamar myColor.R o .G, o .B para obtener el componente que desea si desea leer los valores más tarde. El objeto myColor ya tiendas de R, G, y B, así que no hay punto en la duplicación de la información.