接口只有方法的定义而没有方法的实现,要实现一个接口,需要声明一个从该接口继承的类,并且实现该接口方法。
但是......
在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()方法吧?这种接口的写法是什么技术,或者是怎么称呼这种用法?有人能给些提示么?
但是......
在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()方法吧?这种接口的写法是什么技术,或者是怎么称呼这种用法?有人能给些提示么?
解决方案 »
- 百钱买百鸡的问题,已经计算出第一种可能,我想再显示下一组的可能情况
- 关于串口通讯问题,请高手帮助看下面的代码为何得不到返回数据
- 能帮帮我吗
- 请教高手,继承父类的空DBGrid,在子类中增加了静态列,不能删除,请问真的不能删除吗?
- 求语音解决方案,计划开发一个程序,功能:接收到语音输入后能以文字的形式输出。
- 两个单元相互引用好不好?
- SQLSERVER中字段名是英文字符时带来的问题
- 哪位大侠知道哪种商业或共享软件是用delphi做的?
- delphi 调用C#动态库问题
- Socket银行接口,受一堆问题困惑!
- 怎么设计超市小票的打印
- 请问 delphi 能 不能 执行 字符串 表达式 ??????????
ws:=HTTPRIO1 as WebService;
s:=ws.Fa('123');----------这里的Fa()是在WebService = interface(IInvokable)接口定义的对吧。! 这里还跟远程的WebService没关系是本地的Delphi方法!那么Fa();只是一个Delphi本地的接口方法!那它的实现在哪?我不是说业务方面的实现
Delphi至少应该有一个过程用来描述Fa是调用了XXX IP 上面的Fa()吧。哎,俺笨嘴拙塞,好像还是没说清楚
下面这段摘自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就无法构造它的内存虚表。
-------------------------
sdzeng(大头鸟)
理解了我说的意思,问题已经基本解决了,非常感谢sdzeng(大头鸟)
给我的提示,我来讲一下我的收获和我查找资料的一个过程。google->'InvRegistry.RegisterInterface(TypeInfo(IEncodeDecode));'->RTTI->静态代理->动态代理Delphi6-7里面的TSoapXXX单元实现了一个类似于Java AOP面向切面的动态代理模块,使用这个单元+RTTI获得接口实例的TypeInfo,就可以用一个方法代理任意多个接口中的方法.