接口只有方法的定义而没有方法的实现,要实现一个接口,需要声明一个从该接口继承的类,并且实现该接口方法。
但是......
在Delphi开发WebService客户端的时候,使用WSDL importer生成WebService的接口文件,例如,文件的内容是这样的:
  WebService = interface(IInvokable)
  ['{80317460-DB25-922D-5629-E01703C1F239}']
    function  Fa(a:WideString):WideString; stdcall;
    .......................
  end;然后在调用这个接口的时候这样写:ws:WebService;
ws:=HTTPRIO1 as WebService;s:=ws.Fa('123');  //--超级不解HTTPRIO1: THTTPRIO; -->  THTTPRIO = class(TRIO) --> TRIO = class(TComponent, IInterface, IRIOAccess)HTTPRIO1 as WebService 这里是把一个类引用转换为接口引用,但是
s:=ws.Fa('123');
这一句又是什么原理?我看Delphi的代码!HTTPRIO1根本就没有实现Fa()方法的代码阿!
就算没有Fa()方法的具体实现代码(正常,这代码应该在WebService的服务端),
但至少应该有一个方法,假设P(),用来调用WebService端的Fa()方法吧?这种接口的写法是什么技术,或者是怎么称呼这种用法?有人能给些提示么?

解决方案 »

  1.   

    fa();是webservisers 中的方法啊
      

  2.   

    fa(); 是WebService 中的方法啊 上面打错了~~
      

  3.   

    我知道fa();是WebService中的方法!我现在是想知道HTTPRIO1是用怎样的一种机制调用服务端Fa();的方法;客户端的"代码"流程应该是这样的吧,
    ws:=HTTPRIO1 as WebService;
    s:=ws.Fa('123');----------这里的Fa()是在WebService = interface(IInvokable)接口定义的对吧。! 这里还跟远程的WebService没关系是本地的Delphi方法!那么Fa();只是一个Delphi本地的接口方法!那它的实现在哪?我不是说业务方面的实现
    Delphi至少应该有一个过程用来描述Fa是调用了XXX IP 上面的Fa()吧。哎,俺笨嘴拙塞,好像还是没说清楚
      

  4.   

    本人没有看过THTTPRio的代码,也不知道THTTPRio如何在as的时候创建虚表
    下面这段摘自http://www.focusexe.com/prog/art_data_more.php?ar_it_id=22&gid=&gr_name=DELPHIDelphi6 新体验——Web Service(三)(转)------------------------
    使用as操作符将THTTPRio实例转换成可调用接口。当进行这种操作的时候,就会在内存中动态创建一份关联接口的虚表,使你可以进行接口调用:InterfaceVariable := X as IEncodeDecode;
    Code := InterfaceVariable.EncodeValue(5);THTTPRio依靠引用注册表获取关于可调用接口的信息。如果客户端程序不具有一份引用注册表,或者可调用接口没有注册,THTTPRio就无法构造它的内存虚表。
    -------------------------
      

  5.   

    fa的定义在相应的tbl文件中,针对delphi这个文件的源代码就是xxxx_TBL.pas
      

  6.   

    似乎是只有
    sdzeng(大头鸟)
    理解了我说的意思,问题已经基本解决了,非常感谢sdzeng(大头鸟)
    给我的提示,我来讲一下我的收获和我查找资料的一个过程。google->'InvRegistry.RegisterInterface(TypeInfo(IEncodeDecode));'->RTTI->静态代理->动态代理Delphi6-7里面的TSoapXXX单元实现了一个类似于Java AOP面向切面的动态代理模块,使用这个单元+RTTI获得接口实例的TypeInfo,就可以用一个方法代理任意多个接口中的方法.