【问题标题】:What's the benefit of implement interface at runtime?在运行时实现接口有什么好处?
【发布时间】:2016-04-20 07:21:06
【问题描述】:

我正在尝试理解TVirtualInterface 类。

{$APPTYPE CONSOLE}

uses
  SysUtils, Rtti;

type
  ISpecificInterface = interface(IInvokable)
    ['{281D8B97-397E-430A-895A-9CA4E1F5FB5F}']
    procedure SpecificProcedure;
  end;

procedure AProcedure(Method: TRttiMethod; const Args: TArray<TValue>;
  out Result: TValue);
begin
  Writeln(Method.ToString);
end;

var
  ISpecificInterfaceInstance: ISpecificInterface;

begin
  ISpecificInterfaceInstance := TVirtualInterface.Create
    (TypeInfo(ISpecificInterface), AProcedure) as ISpecificInterface;

  ISpecificInterfaceInstance.SpecificProcedure;

end. // TVirtualInterface ref. counter is decremented

在运行时实现接口有什么好处?

空间有什么用?

【问题讨论】:

  • docs 说:“TVirtualInterface 的主要应用领域是 SOAP 消息传递。SOAP 服务器声明了具有特定功能的服务。WSDL 导入器创建了一个 Delphi 接口来“镜像”服务器服务。在客户端,在运行时创建一个类,它实现了反映服务器服务的Delphi接口(TVirtualInterface),当调用这个类的一个方法时,调用被封装在一个SOAP信封中,发送到服务器,解码,并将结果发送回 Delphi 客户端。”

标签: oop delphi rtti


【解决方案1】:

描述是here

为远程过程调用编组提供功能...

【讨论】:

  • 没错。从上面的示例中,AProcedure 方法可以将参数序列化,将它们发送到远程服务器,等待结果并将它们返回给调用者。换句话说,TVirtualInterface 实例可以充当调用者的代理。
【解决方案2】:

有很多使用它的方法,但它们都有一个共同点,因为您使用的是接口,所以调用方并不关心实现的样子——如果它是一个实际的类,它在compiletime 或者如果您在运行时通过TVirtualInterface 或其他方式动态实现它,只要它的行为符合接口协定即可。

当它首次在 XE2 中引入时,我写了一个 article about it 及其可能的用法。正如 cmets 中提到的那样,这实际上使我们能够以非常简单的方式实现模拟框架,只需声明通用模拟类型,在内部创建一个接口代理来处理模拟上指定的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多