Как я уже говорил выше, невозможно сразу объявить интерфейс и реализовать его на стороне Delphi с помощью TdwsUnit
. Однако можно добиться того, что вам нужно, другими способами.
Я предполагаю, что вы объявили свой интерфейс и свой класс в файле TdwsUnit
. Назовем их IMyInterface
и TMyClass
.
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. Используйте утиную печать
Поскольку DWScript поддерживает утиный ввод, вам фактически не нужно объявлять, что ваш класс реализует интерфейс. Вместо этого вы просто указываете, какой интерфейс вам нужен, и позволяете компилятору выяснить, может ли объект удовлетворить эту потребность:
var MyStuff: IMyInterface;
MyStuff := TMyObject.Create as IMyInterface;
MyStuff.DoSomething;
person
SpeedFreak
schedule
13.09.2015