gpt4 book ai didi

delphi - 使用 SuperObject 在类中调用过程

转载 作者:行者123 更新时间:2023-12-03 18:37:36 26 4
gpt4 key购买 nike

我正在尝试使用 super 对象在类中调用一个过程,但它不起作用,我在这里做错了什么?

代码示例:

program test_rpc;

{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
SysUtils, superobject;

type
TCC = class(TObject)
published
procedure controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
end;

procedure TCC.controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
var
i: Integer;
begin
write('action called with params ');
writeln(Params.AsString);
end;

var
s: ISuperObject;
CC: TCC;
begin
CC := TCC.Create;
s := TSuperObject.Create;
s.M['controler.action1'] := CC.MethodAddress('controler_method1');
try
s['controler.action1("HHAHAH")'];
finally
s := nil;
writeln('Press enter ...');
readln;
end;
end.

那会崩溃,我在这里做错了什么?

它实际上是“用参数调用的 Action ”,但没有显示参数......

最佳答案

super 方法的签名如下:

TSuperMethod = procedure(const This, Params: ISuperObject;
var Result: ISuperObject);

这意味着您不能使用实例方法,因为实例方法具有不兼容的签名。您的方法必须如下所示:
procedure sm(const This, Params: ISuperObject; var Result: ISuperObject);
begin
....
end;

您收到运行时错误而不是编译时错误的原因是您使用 @ 运算符放弃了类型系统。删除@,您的程序将在编译时失败,并显示一条错误消息,该错误消息是我上面所说的更简洁的版本。

Delphi 编程的一大谬误是必须使用@ 运算符来获取函数指针。这是一个坏习惯,你最好改掉。

关于delphi - 使用 SuperObject 在类中调用过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com