【问题标题】:Events in Classes课堂活动
【发布时间】:2010-06-17 18:10:47
【问题描述】:

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

例如,在这一项中,我总是希望 myColor 随时了解任何或所有 RedGreenBlue 属性的任何更改。

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)

【问题讨论】:

    标签: vb.net oop class custom-events


    【解决方案1】:

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

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

    这样它会一直保持同步。

    【讨论】:

    • brenden,我非常感谢您的回复。 Bob 详细说明了为什么我不应该考虑事件,所以我会用他的作为答案,但绝对 +1 给你!
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】: