在dwscript中使用/注入Delphi中实现的接口实例

时间:2015-09-13 00:11:50

标签: delphi dwscript

我有一个界面(实际上是多个界面),我想用这种方式:

  • 在dwscript脚本中创建接口声明可用的单位(如果需要)。

  • 在用Delphi编写的主机应用程序中创建实现接口的对象。

  • 使这些界面以某种方式提供给dwscript脚本。

  • 并在剧本中正常使用它们。

有可能这样做吗?

我试图提供在类中返回这些接口的方法,但是当我在RTTI上使用这个类时,那些找不到的方法。

1 个答案:

答案 0 :(得分:1)

正如我上面所说,不能立即声明一个接口并用TdwsUnit实现它的Delphi端。但是,有可能以其他方式实现您的目标。

我假设你已经在TdwsUnit中声明了你的界面和你的班级。我们称他们为IMyInterfaceTMyClass

type
  IMyInterface = interface
    procedure SetValue(const Value: string);
    function GetValue: string;
    property Value: string read GetValue write SetValue;
    procedure DoSomething;
  end;

type
  TMyClass = class(TObject)
  protected
    procedure SetValue(const Value: string);
    function GetValue: string;
  public
    property Value: string read GetValue write SetValue;
    procedure DoSomething;
  end;

解决方案1 ​​ - 在运行时更改类声明

TdwsUnit.OnAfterInitUnitTable事件创建一个事件处理程序,并将该接口添加到类声明中:

procedure TDataModuleMyStuff.dwsUnitMyStuffAfterInitUnitTable(Sender: TObject);
var
  ClassSymbol: TClassSymbol;
  InterfaceSymbol: TInterfaceSymbol;
  MissingMethod: TMethodSymbol;
begin
  // Add IMyInterface to TMyClass
  ClassSymbol := (dwsUnitProgress.Table.FindTypeLocal('TMyClass') as TClassSymbol);
  InterfaceSymbol := (dwsUnitProgress.Table.FindTypeLocal('IMyInterface') as TInterfaceSymbol);
  ClassSymbol.AddInterface(InterfaceSymbol, cvProtected, MissingMethod);
end;

现在,您可以通过脚本中的界面访问该类的实例:

var MyStuff: IMyInterface;
MyStuff := TMyObject.Create;
MyStuff.DoSomething;

解决方案2 - 使用duck typing

由于DWScript支持duck typing,因此您实际上并不需要声明您的类实现了接口。相反,您只需说明您需要的接口,让编译器确定对象是否满足该需求:

var MyStuff: IMyInterface;
MyStuff := TMyObject.Create as IMyInterface;
MyStuff.DoSomething;