我发现我在课堂中写了很多代码,以使属性彼此同步。我已经阅读了课堂上的活动,但无法围绕如何使它们为我想要的东西缠绕着我的头。我可以在这里使用一些建议。

例如,在这个中,我一直想保留 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) 在每个子例程中?

有帮助吗?

解决方案

在您的情况下,事件没有用。

事件被用作其他人的代码对您的代码作用的方式。您将进行一个活动,以便您可以告诉世界您的代码正在做的事情。您可以改变颜色的事件,每当颜色在某种程度上更改时都可以提高,但这并不是为了您的利益,并且会被任何其他使用您的班级的代码使用,并想在颜色已更改。

事件是针对外部代码的,而不是内部班级管理。正如我之前所说的那样,您遇到的问题更多是一个封装问题,您可以解决两种方法:

1)更新内部变量,每次更改某些东西就像您正在做的事情一样。但是我建议制作一个称为colorChanged()的内部私人功能,它将像您一样重新计算颜色。我说要做一个功能,因为稍后,如果您想要更改颜色时想要更多逻辑,则不必担心在3个地方更改它。

2)更新颜色时(像我之前的人一样)时进行更新。制作每次访问颜色的属性,以计算颜色。这是最简单的,在大多数情况下效果完美。但是,如果您经常使用该属性,那么所有这些重新计算都可能是一个性能问题(在这种情况下,计算颜色不是很密集,所以没关系)。

在这种情况下,尽管性能缺陷很小,但我还是为了简单起见,我会做选项2 ...我的意思是微小的性能弊端...

其他提示

在这种情况下

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