2010-06-17 24 views
0

我發現我在我的類中編寫了很多代碼以保持屬性彼此同步。我讀過關於類的事件,但一直未能圍繞如何使它們適用於我正在尋找的內容。我可以在這裏使用一些建議。類中的事件

例如,在這一塊,我總是想保持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)

回答

2

在你的情況下,事件沒有用。

事件被用作其他人的代碼根據您的代碼行事的方式。你會做一個事件,以便你可以告訴世界你的代碼正在做的事情。你可以創建一個改變顏色的事件,你可以在每次改變顏色的時候改變顏色,但這不會對你有好處,並且會被其他任何使用你的類的代碼所使用,顏色改變了。

事件用於外部代碼,不用於內部類管理。正如前面的人所說,你遇到的問題更多的是一個封裝問題,你可以用兩種方法解決:

1)每次更新內部變量時,就像你正在做的事情一樣。但我建議製作一個名爲ColorChanged()的內部私有函數,它會像你一樣重新計算顏色。我說要做一個功能,因爲如果你在更改顏色時想要更多的邏輯,那麼在後面的路上,你不必擔心在3個地方改變它。

2)更新當它被重新申請時的顏色(就像我之前的人)。創建一個屬性,在每次訪問時計算顏色。這是最簡單的,並且在大多數情況下是完美的。但是如果你使用這個屬性很多,那麼所有這些重現都可能是一個性能問題(在這種情況下,計算顏色不是很密集,所以沒關係)。

在這種情況下,我會爲簡單起見做選項2,儘管微小的性能缺點......我的意思是微小的性能缺點...

+0

感謝鮑勃,這對我來說是非常好的見解。 – 2010-06-17 18:28:57

4

在這種情況下,爲什麼你不改變你的myColor屬性是這樣的:

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

這樣,它會始終保持同步。

+0

brenden,我真的很感謝迴應。鮑勃給了我更多關於爲什麼我不應該考慮事件的細節,所以我會用他作爲答案,但是給你定義+1! – 2010-06-17 18:27:49

2

我就弄死紅,綠類變量,和藍色,只需讓顏色對象處理所有的值。如果您想稍後讀取值,可以調用myColor.R或.G或.B來獲取所需的組件。 myColor對象已經存儲了R,G和B,所以沒有必要重複這些信息。