Использование SuperObject для вызова процедуры внутри класса

Я пытаюсь вызвать процедуру в классе с использованием суперобъекта, но это не сработает, что я здесь делаю не так?

Пример кода:

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.

что рухнет, что я тут делаю не так?

на самом деле он доходит до "действия, вызванного с помощью Params", но не может показать параметр

1 ответ

Решение

Супер метод имеет подпись следующим образом:

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

Это означает, что вы не можете использовать метод экземпляра, так как метод экземпляра имеет несовместимую подпись. Ваш метод должен выглядеть так:

procedure sm(const This, Params: ISuperObject; var Result: ISuperObject);
begin
  ....
end;

Причина, по которой вы получаете ошибку времени выполнения, а не ошибку времени компиляции, заключается в том, что вы отказались от системы типов с помощью оператора @. Удалите @, и ваша программа потерпит неудачу во время компиляции с сообщением об ошибке, которое является более краткой версией того, что я сказал выше.

Это одна из самых больших ошибок программирования на Delphi, что для получения указателя на функцию необходимо использовать оператор @. Это плохая привычка, что вы должны преуспеть, чтобы отучиться.

Другие вопросы по тегам