gpt4 book ai didi

delphi - 使用 'anonymous' 类实现 Delphi 接口(interface)

转载 作者:行者123 更新时间:2023-12-03 14:45:12 31 4
gpt4 key购买 nike

我有一个界面。

type IProgressObserver = interface(IInterface)
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;

我已经使用命名类实现了该接口(interface),如下所示:

type TProgressObserver=class(TInterfacedObject, IProgressObserver)    
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;

... implementation of methods go here .....

addProgressObserver(TProgressObserver.Create);

是否可以在不声明类的情况下创建此接口(interface)的实例?像这样的(想象的)代码,它会做与上面相同的事情:

 addProgressObserver(IProgressObserver.Create()
begin
procedure ReportProgress(Progress:Integer)
begin
ShowMessage('Progress Observed!');
end

procedure ReportError(Message:string)
begin
Log(Message);
end
end;);

Delphi有匿名过程,但是它有匿名类吗?

我找到了this similar question ,但它是用 Java 编写的。

我使用的是Delphi 2010

最佳答案

可以获得相当匿名的效果,使用匿名方法实现接口(interface)。但是您没有获得对此的实际编译器支持,您必须自己声明所有匿名方法类型,然后实现实际的“匿名”类。给定您的 IProgressObserver 接口(interface),实现将如下所示:

type
// This is the interface we'll be dealing with.
IProgressObserver = interface(IInterface)
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
end;

// This will help us anonymously create implementations of the IProgressObserver
// interface.
TAnonymousObserverImp = class(TInterfacedObject, IProgressObserver)
type
// Declare reference types for all the methods the interface needs.
TReportProgressProc = reference to procedure(Progress:Integer);
TReportErrorProc = reference to procedure(Message:string);
strict private
FReportProgressProc: TReportProgressProc;
FReportErrorProc: TReportErrorProc;

// Actual implementation of interface methods.
procedure ReportProgress(Progress:Integer);
procedure ReportError(Message:string);
// private constructor, so we'll forced to use the public "Construct" function
constructor Create(aReportProgressProc: TReportProgressProc; aReportErrorProc: TReportErrorProc);
public
// This takes the required anonymous methods as parameters and constructs an anonymous implementation
// of the IProgressObserver interface.
class function Construct(aReportProgressProc: TReportProgressProc; aReportErrorProc: TReportErrorProc): IProgressObserver;
end;

{ TAnonymousObserverImp }

class function TAnonymousObserverImp.Construct(
aReportProgressProc: TReportProgressProc;
aReportErrorProc: TReportErrorProc): IProgressObserver;
begin
// Call the private constructor
Result := TAnonymousObserverImp.Create(aReportProgressProc, aReportErrorProc);
end;

constructor TAnonymousObserverImp.Create(
aReportProgressProc: TReportProgressProc; aReportErrorProc: TReportErrorProc);
begin
inherited Create;
// We simply save the references for later use
FReportProgressProc := aReportProgressProc;
FReportErrorProc := aReportErrorProc;
end;

procedure TAnonymousObserverImp.ReportError(Message: string);
begin
// Delegate to anonymous method
FReportErrorProc(Message);
end;

procedure TAnonymousObserverImp.ReportProgress(Progress: Integer);
begin
// Delegate to anonymous method
FReportProgressProc(Progress);
end;

一旦所有代码就位,您就可以编写如下代码:

var i: IProgressObserver;
begin
i := TAnonymousObserverImp.Construct(
procedure (Progress:Integer)
begin
// Do something with Progress
end
,
procedure (Message:string)
begin
// Do something with Message
end
)
end;

对我来说看起来很匿名!鉴于 Delphi 中匿名方法的实现,它也相当快速且有效。

关于delphi - 使用 'anonymous' 类实现 Delphi 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6786401/

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