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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top