0

我发现我在我的类中编写了很多代码来保持属性彼此同步。我已经阅读了有关 Classes 中的事件的文章,但无法理解如何使它们为我正在寻找的东西工作。我可以在这里使用一些建议。

例如,在这一个中,我总是想及时了解myColor任何或所有Red,GreenBlue属性的任何变化。

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)每个子例程?

4

3 回答 3

4

在这种情况下,您为什么不将 myColor 属性更改为:

Private ReadOnly Property myColor As Color
  Begin Get
    Return Color.FromArgb(Red, Green, Blue)
  End Get
End Property

这样,它将始终保持同步。

于 2010-06-17T18:14:10.857 回答
2

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

事件被用作其他人的代码对您的代码采取行动的一种方式。你会做一个事件,这样你就可以告诉全世界你的代码正在做什么。您可以为颜色更改创建一个事件,每次以某种方式更改颜色时都可以引发该事件,但这不会为您带来好处,并且只会被使用您的类并想要做某事的任何其他代码片段使用颜色改变了。

事件用于外部代码,而不用于内部类管理。正如我之前的人所说,您遇到的问题更多是封装问题,您可以通过两种方式解决:

1)每次像您所做的那样更改某些内容时更新内部变量。但我建议创建一个名为 ColorChanged() 的内部私有函数,它会像你一样重新计算颜色。我说创建一个函数是因为以后如果您在更改颜色时想要更多逻辑,则不必担心在 3 个位置进行更改。

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

在这种情况下,尽管存在微小的性能缺陷,但为了简单起见,我会选择选项 2……我的意思是微小的性能缺陷……

于 2010-06-17T18:20:30.293 回答
2

我将取消 Red、Green 和 Blue 的类变量,并简单地让颜色对象处理所有值。如果您想稍后读取这些值,您可以调用 myColor.R、或 .G 或 .B 来获​​取所需的组件。myColor 对象已经存储了 R、G 和 B,因此没有必要复制这些信息。

于 2010-06-17T18:21:49.603 回答