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

Delphi - Why events are not copied in Assign() procedures?

我观察了几个 Assign() 过程并注意到在赋值过程中事件通常被忽略。例如,TBitmap 赋值方法不会复制 OnChange 事件。我想知道

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

此致

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

这也是 Assign 的强大之处。您分配的来源甚至不必是同一类型的组件,因为每个分配都是自定义实现。在您的 TBitmap 示例中,您可以将其分配给 TPicture,您甚至可以将其他类型的图形分配给 TBitmap,这将使这些图形在位图的 canvas.

上自行绘制

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

事件不同。拥有事件处理程序并管理它不是由对象决定的。做出其订阅者也想订阅另一个对象的决定不是该对象的工作。事件处理程序的值 of/pointer 不是对象(相关)数据的一部分。

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

所以对我来说,不复制事件是完全合理的,而且我认为我从未将事件包含在我自己编写的 Assign 实现中。