题
我发现我在课堂中写了很多代码,以使属性彼此同步。我已经阅读了课堂上的活动,但无法围绕如何使它们为我想要的东西缠绕着我的头。我可以在这里使用一些建议。
例如,在这个中,我一直想保留 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,因此复制信息没有意义。