Delphi中对象委托的共同祖先

Pau*_*aul 2 delphi delegates ancestor

对于使用of object子句声明的Delphi委托,是否有一些共同的祖先?

我需要为TNotifyEvent和我的自定义委托找到一个共同的祖先:

TMyEvent = procedure(Sender: TObject; msg: stringh); of object;
Run Code Online (Sandbox Code Playgroud)

制作用于触发这些事件的通用方法.

我应该使用指针吗?还是TObject?

Dav*_*nan 6

您需要了解方法指针的实现细节.它们存储为所谓的双指针值.一个指针用于方法调用(实例)的主题,一个指针用于方法本身(代码).

您可以使用类型TMethodSystem单位来表示方法指针.它的声明看起来像这样(为简单起见,删除了比较运算符):

type
  TMethod = record
    Code, Data: Pointer;
  end;
Run Code Online (Sandbox Code Playgroud)

您需要使用类型转换来在这些类型之间进行分配:

uses
  System.Classes;

var
  Event: TNotifyEvent;
  Method: TMethod;

begin
  Method := TMethod(Event);
  TMethod(Event) := Method;
end.
Run Code Online (Sandbox Code Playgroud)

显然,这些都不是类型安全的,因此您需要确保正确性.编译器无法帮助你.没有像检查类型转换运算符那样as处理方法指针.也就是说,当你TMethod转换为特定的方法指针类型时,你必须确保TMethod实例确实是你所投射的方法指针类型的一个实例.可以认为整个过程类似于从类型指针转换为无类型指针,然后再返回.

现在,如果要将任意方法指针存储到TMethod实例中,那很好.但是当你随后需要解雇这些方法时会发生什么.您需要知道每个TMethod实例背后的方法指针类型.这样你就知道如何投射它,它需要什么参数,以及如何调用它.这意味着您必须存储有关方法的真实类型的额外信息,以及原始方法本身.

所以,我认为我或许回答了你提出的问题,但我不确定它对你有多大用处.要理解我认为我们真的需要了解更多关于您要实现的目标,以及您拥有什么信息的时间.

例如,如果您知道在需要将其存储时要传递给方法的参数,则可以使用变量捕获并将其包装在匿名方法中.这将允许您保留类型安全性并避免我在上面演示的任何相当可疑的演员阵容.也许您需要部分应用程序,作为调整非齐次方法指针以使其具有相同接口的方法.在这种情况下,匿名方法可以帮助.

  • 也许,但我仍然不确定底层问题是什么,所以我专注于实际问题.而且我不愿意花更多的时间在它已经做了相当多的事情! (2认同)