Delphi - 为什么不在Assign()过程中复制事件?

Jea*_*ond 2 delphi events copy ignore assign

我观察了几个Assign()过程并注意到在分配期​​间通常会忽略事件.例如,TBitmap分配方法不会复制OnChange事件.我想知道

  1. 如果这是一种在分配期间不复制事件的普遍接受的方式,即如果所有用户都依赖于在分配期间事件永远 - 并且永远不应该 - 被复制的事实?
  2. 为什么在分配期间(至少通常)不复制事件?
  3. 或许我错了,事件可能完全被复制,只是根据具体情况而定?

问候

Gol*_*rol 5

我不知道一个"规则"决定了这一点,但我认为你是对的,它几乎从未发生过.这取决于组件的作者,因为在TPersistent中引入了Assign,但在实际实现覆盖之前不会自行执行任何操作.实际上它默认抛出异常(X不能分配给Y).

这也是分配的力量.您分配的源甚至不必是相同类型的组件,因为每个分配都是自定义实现.在TBitmap示例中,您可以将其分配给TPicture,甚至可以将其他类型的图形分配给TBitmap,这样可以让这些图形在位图的画布上绘制.

在大多数情况下,如果不是全部,我遇到的情况,分配就是这样的:分配,有时甚至将一个对象的数据(状态,如果你愿意)转换成另一个对象.

事件是不同的.具有事件处理程序并管理它不是一个对象.决定其订阅者还想订阅其他对象并不是该对象的工作.指向事件处理程序的/指针的值不是对象的(相关)数据的一部分.

它只是暴露了其他人听到发生的事情的可能性,如果那些东西也想要听另一个对象,他们只需要为这些对象分配一个事件处理程序.

所以对我而言,事件没有被复制是完全合理的,而且我认为我从未在我自己编写的Assign实现中包含事件.