2017-03-07 44 views
2

我觀察了幾個Assign()過程,並注意到在分配過程中通常忽略事件。例如,TBitmap分配方法不會複製OnChange事件。我想知道德爾福 - 爲什麼不在Assign()過程中複製事件?

  1. 如果它的分配期間普遍接受的方式來不可複製的事件,即如果所有用戶都依賴於一個事實,即事件是從來沒有 - 而且不應該 - 在分配過程中被複制?
  2. 爲什麼事件在分配過程中(至少是通常)不被複制?
  3. 或者我錯了,事件可能完全被複制,只是視情況而定?

問候

+1

由組件作者決定。我會想象事件通常不會被複製爲「Assign」的一部分,因爲它們被視爲以非常寬鬆的方式定義行爲而不是狀態。我想其他動機是一個事件隱含地包含對另一個對象的引用。 「分配」預計將複製值而不是引用。 「如果你寫了」A.Assign(B); B.Free',並將'A'與一堆對'B'實現的事件處理程序的陳舊引用保留下來。 –

+1

@DavidHeffernan推測在B的事件處理程序中持有的方法引用不屬於它......它寧可打敗目的,不是?這些通常不會引用屬於已配置B的外部對象的方法嗎? –

+2

這通常是這種情況。也許我的代碼示例太簡單了。但是有一個很明顯的陳舊引用的危險。 –

回答

5

我不知道,決定這個「規則」,但我認爲你是正確的,它幾乎不會發生。這取決於組件的作者,因爲Assign是在TPersistent中引入的,但在你實際實現覆蓋之前,它本身不會執行任何操作。實際上它會引發一個異常(X不能被分配給Y)。

這也是分配的權力。您分配的源代碼甚至不必是同一類型的組件,因爲每個分配都是自定義實現。在您的TBitmap示例中,您可以將其分配給TPicture,並且您甚至可以將其他類型的圖形分配給TBitmap,以便讓這些圖形自己繪製在位圖的畫布上。

在我遇到的大多數情況下(即使不是全部),Assign就是這樣的:分配,有時甚至是將一個對象的數據(如果你喜歡的狀態)轉換成另一個對象。

事件是不同的。這不取決於擁有事件處理程序並對其進行管理的對象。決定訂閱者還想訂閱其他對象並不是該對象的工作。指向事件處理程序的/指針的值不是對象的(相關)數據的一部分。

它只是暴露了其他人聽到發生的事情的可能性,如果這些事情想要聽另一個對象,他們也必須爲這些對象分配一個事件處理程序。

對我而言,事件不會被複制是非常有意義的,而且我認爲我從來沒有在自己編寫的Assign實現中包含事件。