我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类。在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发。在ice中,client和server只是相对于ice object的使用关系,client即使用代理远程调用ice object的一方,server相对就是为ice object提供执行servant的一方。并非我们传统意义上的c/s结构中的client和server。ice object既可以存在地c/s结构的server端,c/s结构的client端同样也可以提供ice object给server端远程调用。

我们先来看一下,slice对定义的空类和空接口如何生成代码,下面是生成的stub存根类和skeleton骨架类的类图。

上面分别在ice文件定义一个空类"Empty"和一个空接口"I",slice分别为我们在名字空间::IceProxy::Module和Module下都生成了class Empty和class I的类。

不论是类还是接口,对于空的定义目标,slice生成的stub存根类都只是重写(override)了静态方法ice_staticId和成员方法_newInstance。上图左边的两个类Empty和I则是stub存根类。再来看右边生成的skeleton骨架类,slice也几乎做了同样的处理,重写(override)了骨架类最小接口ice_id,ice_ids以及ice_isA,还有跟streaming流化相关两个实现函数_iceReadImpl和_iceWriteImpl。唯一不同的是对于定义为类的Empty,它的skeleton骨架类多了两个成员函数ice_clone和ice_factory。

当我们定义一个类或接口,slice就会最少为我们生成上面类图所示的函数。当我们再定义一对非空的类或接口,我们就可以观察到slice为我们生成了什么,下面的类图隐去上面给出的已知。

首先是定义一个有一个方法的简单接口Intf。

灰色的类是Ice项目内置的类,非slice生成的类。slice为我们针对这个接口的远程调用生成了上面的框架的代码。生成的代码比重偏于Stub存根类(即代理方)的使用(如何应用远程调用)上。Skeleton骨架类重写(override)_iceDispatch分派,开设一个待实现的接口方法函数。

然后是定义一个非空的类NotEmpty,简单地有一个成员,成员类型为我们开篇时定义的Empty。

与上面给出接口生成的类图相比,slice对类的生成框架代码主要集在实体端,并且都是与流化(streaming)相关的设施。而生成的Stub存根类和对Empty(空类)生成的Stub存根类一样,因为它并没有接口方法,可以提供给代理进行远程访问。

从上面可以看到不论类还是接口,在代码映射后都是一个类实体。在slice定义时,我们使用这些类或接口时,都看作一个类实体。而使用这些类或接口的指针时,则看作是它们的代理。我们看下面定义

class B;
interface A {
B b;
B* bprx;
}; class B {
};

A::b会映射成::IceInternal::Handle<B>,而A::bprx会映射成::IceInternal::ProxyHandle<B>。指针被看作是一个对象实体的代理(引用)。

不论是类实体还是代理,都可以进行流化(streamin)在远程调用过程中传递。当传递一个指针,就是在传递相对于某个对象实体的代理。通过代理在ice世界任何一处都可以使用远程调用访问目标的实体。但是传递一个实体而非代理时,就和我们的c++语言在函数中传递对象实体一样,会在传递的目的方进行实体的构造。所以在ice程序中,尽管有一方使用代理进行远程访问为主,但它同样需要依赖slice生成的skeleton骨架类的代码,stub存根类和skeleton骨架类的代码并不分开发给c/s两方的开发者。

下面是以ice代码项目的测试例子项目为例,cpp/test/objects。

slice中定义的类图

slice生成的Skeleton骨架类

ZeroC ICE的远程调用框架 class与interface的更多相关文章

  1. ZeroC ICE的远程调用框架 Slice如何帮助我们进行Ice异步编程(AMI,AMD)

    Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架. 当Slice不为我们生成代码时,我们仍然可以按 ...

  2. ZeroC ICE的远程调用框架 AMD

    继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...

  3. ZeroC ICE的远程调用框架

    想搞清楚slice为我们生成了什么样的框架代码,就先搞明白Ice的远程调用框架暗中为我们做了些什么? Ice将Ice Object的方法调用分为三个阶段(或步骤),分别是begin,process和e ...

  4. ZeroC ICE的远程调用框架 AMI与AMD -Why?

    在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...

  5. ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架

    Ice框架提供了不少回调设施,其中一些是使用Ice远程调用进行ami模式或amd模式的支撑.本篇来看一下用于代理端的回调设施. Ice代码中有好几个Callback相关命名的基类,并且slice还会为 ...

  6. ZeroC ICE的远程调用框架 ServantLocator与Locator

    ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...

  7. ZeroC ICE的远程调用框架 ThreadPool

    ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如 ...

  8. ZeroC ICE的远程调用框架 代理引用地址

    在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...

  9. ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator

    ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...

随机推荐

  1. java web项目下的lib和build path 中jar包问题解惑

    一.build path&WEB-INFO/lib介绍 build path:可以说是引用: WEB-INFO/lib:可以说是固定在一个地方: eclipse编译项目的时候是根据build ...

  2. 安装配置 Android Studio

    概述 Android Studio 本身应该是开箱即用的,但是由于 dl.google.com 访问太慢,导致了这样那样的问题,因此我们只需要改一下 hosts 就行了 具体步骤 在Ping检测网站查 ...

  3. Veins(车载通信仿真框架)入门教程

    Veins入门教程——教你如何下手研究 目录 Veins入门教程——教你如何下手研究 目录 废话少说! 讲解omnetpp.ini!(挑关键的) 讲解RSUExampleScnario.ned! 注意 ...

  4. Hadoop环境部署

    1.虚拟机克隆 在VM界面点击查看-自定义-库,然后在左边我的计算机下右键点击安装好的第一个系统,然后管理-克隆,选择克隆系统所在的文件路径即可. 2.三台主机名字修改 root用户下: (1)编辑n ...

  5. UnityWebRequest_ZT

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  6. ubuntu12.04 添加程序启动器

    方法: 1. 在/usr/share/applications目录下创建eclipse启动器配置文件 cd /usr/share/applications vim eclipse.desktop 2. ...

  7. VB.NET 与 SAP RFC连接问题点

    与SAP RFC连接,电脑上必须要安装SAP软件,否则会报错ActiveX 输入工单号,无法带出SAP内接口RFC信息. 确认原因为:RFC接口需求的工单参数需要在前面加两位00,例如:1000541 ...

  8. 《Effective Java》 读书笔记(八)避免使用Finalizer和Cleaner机制

    Finalizer和Cleaner并不等同于C++中的析构函数,是不确定多久会被调用的,甚至有时候可能不会被调用,因此除了作为一个安全网或者终止非关键的本地资源,不应该在Finalizer或Clean ...

  9. AutoCad 二次开发 .net 之相同块的自动编号

    主要步骤: 一.获取一个块的id: 其中oId就是了. 二.通过次oId获取块引用blkRef: 三.通过它获取所有相同的块引用的id集合: 四.通过步骤三的集合得到所有的块引用得到集合listBr: ...

  10. 学习笔记49_Redis

    Redis和memcache区别: 1 . mm是通过客户端驱动实现集群化,Redis是通过服务器配置文件集群 2. redis是可以进行持久化的存储 3. redis提供高级的数据结构,队列,栈都提 ...