gpt4 book ai didi

delphi - 如何在 Delphi 10.2 中使用接口(interface)方法作为方法类型的参数

转载 作者:行者123 更新时间:2023-12-03 15:42:52 25 4
gpt4 key购买 nike

我有一个类实例和两个对其的引用。有一个对象引用 (aMII : TMyInterfaceImpl) 和一个接口(interface)引用 (iMI : IMyInterface)。当我使用对象引用将其方法之一分配给方法类型变量 (methodRef : TMyMethodRef) 时,它工作正常。

但是如果我想在相同的情况下使用接口(interface)引用,编译器会抛出错误:

[dcc32 Error] Unit1.pas(66): E2010 Incompatible types: 'TMyMethodRef' and 'procedure, untyped pointer or untyped parameter'

最小的例子:

type
TMyMethodRef = procedure of object;
//TMyMethodRef = procedure of interface; // Invalid definition, just a desperate attempt

IMyInterface = interface
['{BEA60A2B-C20F-4E02-A938-65DD4332ADB0}']
procedure foo;
end;

TMyInterfaceImpl = class ( TInterfacedObject, IMyInterface )
procedure foo;
end;

procedure TMyInterfaceImpl.foo;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
aMII : TMyInterfaceImpl;
iMI : IMyInterface;
methodRef : TMyMethodRef;
begin
aMII := TMyInterfaceImpl.Create;
iMI := aMII;
methodRef := aMII.foo; // It compiles
methodRef := iMI.foo; // It does not compile

end;

在我的原始源代码中,我必须使用接口(interface)(由于抽象工厂设计模式,我没有对象引用:function TMyFactory.createMyInterface : IMyInterface)。

我必须使用它的方法之一作为某些事件的回调函数(作为参数传递给 setter 方法:procedure TMyInterfaceImpl2.setOnEvent( onEvent_ : TMyMethodRef )

我该怎么做?如何将接口(interface)引用的方法之一分配给方法类型变量?

我知道有一种解决方案可以实现另一个接口(interface)来访问对象引用,但它不安全(我无法始终确定该类实现这两个接口(interface))并且我不想要这种解决方案:

type
TMyMethodRef = procedure of object;

IMyInterface = interface
['{BEA60A2B-C20F-4E02-A938-65DD4332ADB0}']
procedure foo;
end;

TMyInterfaceImpl = class;

IInstanceAccessor<T> = interface
['{61E36FF2-A9D3-4B46-BAE8-217CBE7A1F18}']
function getInstance : T;
end;

TMyInterfaceImpl = class ( TInterfacedObject, IMyInterface, IInstanceAccessor<TMyInterfaceImpl> )
procedure foo;
function getInstance : TMyInterfaceImpl;
end;

procedure TMyInterfaceImpl.foo;
begin
end;

function TMyInterfaceImpl.getInstance : TMyInterfaceImpl;
begin
result := self;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
iMI : IMyInterface;
aMII : TMyInterfaceImpl;
methodRef : TMyMethodRef;
begin
iMI := TMyInterfaceImpl.Create;
aMII := ( iMI as IInstanceAccessor<TMyInterfaceImpl> ).getInstance;
methodRef := aMII.foo;
end;

最佳答案

你不能这样做。

您可以做的是使用这样的方法声明一个适配器类,并使用该方法作为回调。

type
TMyInterfaceAdapter = class
private
FIntf: IMyInterface;
public
procedure Foo;
property Intf: IMyInterface read FIntf write FIntf;
end;

procedure TMyInterface.Foo;
begin
Assert(Assigned(FIntf), 'no interface assigned');
FIntf.Foo;
end;

关于delphi - 如何在 Delphi 10.2 中使用接口(interface)方法作为方法类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52154237/

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