《ICE系列培训(一).ppt》由会员分享,可在线阅读,更多相关《ICE系列培训(一).ppt(81页珍藏版)》请在三一办公上搜索。
1、ICE系列培训(一),钟潘统一网管平台专项,培训内容,Ice概述Slice语言,1.Ice概述,1.1 Ice简介1.2 Ice术语1.3 Ice架构1.4 示例,1.1 Ice简介,(1)Ice是什么首先,Ice(Internet Communications Engine)是一个面向对象的中间件平台。基本上,这是指Ice提供一系列工具、APIs和库,支持构建面向对象的C/S结构应用程序。其次,Ice应用程序可运行于异构环境:客户端和服务端可使用不同编程语言编写,可以运行在不同操作系统和机器架构上,可以使用多种多样的网络通信技术。同时,这些应用程序的源代码是可移植的而不管部署环境是什么。,1
2、.1 Ice简介,(2)Ice支持哪些环境支持语言:客户端和服务端:C+、Java、C#、Python、Objective-C;客户端:PHP、Ruby支持网络协议:TCP、UDP、SSL支持操作系统及编译器:完整列表见http:/,1.1 Ice简介,(2)Ice支持哪些环境,1.1 Ice简介,(3)Ice包含哪些内容Ice Core:远程通信的运行时支持Ice Util:实用工具库,包含智能指针、线程、Unicode处理等Slice及编译器:定义服务器和客户端交互的契约,并生成语言相关代码Ice ServicesFreeze&FreezeScript:对象持久化IceGrid(Ice3.
3、0前叫IcePack):分布式计算IceBox:服务宿主IceStorm:消息发布订阅IceSSL:SSL支持Glacier2:软件防火墙IcePatch2:软件补丁,1.1 Ice简介,(4)Ice和同类技术比较Ice是和DCOM/COM+、CORBA、WebService同属一类的技术。但是DCOM/COM+只能用于Windows平台,CORBA作为一种规范已经包含过多无用的复杂而变得华而不实、难以使用,WebSerivce以XML-RPC/SOAP为基础导致其效率和安全性是一大软肋,相比之下,Ice更加开放、简洁、高效和安全。参考资料(注意以下内容所用Ice版本比较老):反叛之冰:Int
4、ernet Communications Engine:http:/,1.1 Ice简介,(5)Ice实现目标提供一个适于异构环境使用的面向对象的中间件平台提供一整套的特性,支持广泛领域下现实分布式应用的开发避免不必要的复杂性,使平台易于学习和使用提供一个在网络带宽、内存使用、CPU负载上高效的实现提供一个具有内建安全性,使其适用于不安全的公众网络的实现,1.2 Ice术语,(1)Client and ServerClient和Server是相对的概念,指请求过程中应用程序所充当的角色,Client指请求的发起方,而Server指请求的响应方,因此常常Client和Server的角色是可以互换
5、的,例如有时需要Server回调客户端的方法,此时Server就是充当的Client角色。,1.2 Ice术语,(2)InterfaceInterface是客户端和服务端交互的契约,中立于具体实现语言,采用Slice语言定义。Interface包含0或多个Operation,每个Operation有0或多个参数和一个返回值,参数具有方向性:输入参数由客户端初始化然后传给服务端,而输出参数由服务端初始化然后传给客户端。客户端通过调用Operation发出请求。,1.2 Ice术语,(3)Ice ObjectIce Object是一种概念上或抽象上的实体,具有如下特征:一个Ice Object是本
6、地或远程地址空间中的实体,能响应客户端请求;一个单一的Ice Object可以在一个服务器或多个服务器(冗余的)实例化,如果一个Ice object同时有多个实例,仍然是一个单一Ice Object;每个Ice Object有一个或多个Interface,其中必须有一个为main interface,其他的称为facet,客户端在调用时可以决定使用哪个Interface;每个Ice object有一个唯一的object identity,这个标识符最低要求是在一个adapter内是唯一的,但是为了架构上的好处(34),推荐使用全局唯一标识符,如UUID。,1.2 Ice术语,(4)Endpoi
7、nt表明服务端所使用的协议、地址、端口等,例如default-h 10.78.100.100-p 10000-t 1000,表示协议为default,default的值可通过Ice.Default.Protocol设置,默认为tcp,协议还可以为tcp、udp、ssl;-h 10.78.100.100表示地址;-p 10000表示端口;-t 1000表示超时时间为1秒。多个endpoint用“:”分隔。完整语法见E.2 p1963。,1.2 Ice术语,(5)Object Adapter一个Adapter包含一个或多个endpoint,每个endpoint可使用不同的协议、地址、端口;一个Ad
8、apter包含一个或多个Ice Object的具体化servant。客户端可以通过这些endpoint访问这些servant,Adapter负责将客户请求分派到servant中的应用代码以及协助servant的生命周期管理。,1.2 Ice术语,(6)ServantServant是Ice Object在服务端的具体化,使用具体语言(如C+)实现Interface,然后new一个对象,这样一个Servant就创建了,但是要使Servant成为Ice Object的具体化,这还不够,还需要将Servant加入adapter,并为其具体化的Ice Object起一个标识名,最后激活adapter,这
9、时Ice Object才存在了。一个Servant可以一次具体化一个或多个Ice Object,例如new一个Servant后,可以以不同的名字加入同一个或不同adapter,这时一个Servant就是同时具体化多个Ice Object,客户端在请求过程中可以决定具体化哪一个Ice Object。相反的,一个Ice Object可以有多个Servant,例如在不同地址空间或不同机器上创建不同Servant具体化同一个Ice Object,这样就构成一个冗余系统,提高系统可靠性。,1.2 Ice术语,(7)Proxy和Servant相对,Proxy是Ice Object在客户端的具体化。Prox
10、y扮演着Ice Object的本地代表,客户端要和Ice Object联系,必须持有一个Ice Object的Proxy。当客户端调用Proxy的一个Operation时,Ice运行时会:定位Ice Object;激活Ice Object所在的Server如果它没有运行;激活Ice Object;传输任何输入参数到Ice Object;等待Operation完成;返回任何输出参数和返回值给客户端(或抛出异常)。,1.2 Ice术语,(8)Stringified ProxyProxy中的信息可以表达为一个字符串,例如:SimplePrinter:default-p 10000,其中SimpleP
11、rinter为对象标识;default p 10000为endpoint,表示使用默认tcp协议,端口10000(完整语法见E.1 p1961)。Ice运行时提供API在Proxy和字符串表达之间进行转换。字符串化的好处是可以将Proxy存储在数据库或文本文件。,1.2 Ice术语,(9)Direct Proxy直接Proxy是指Proxy中包含的endpoint就是要访问的服务器地址。(10)Indirect Proxy间接Proxy不包含endpoint,有两种形式:一种只有对象标识,一种包含对象标识和object adapter标识。类似DNS,要确定正确的server,客户端需要将Pr
12、oxy传给location service(32.17),后者查找合适的server地址并返回给客户端。,1.2 Ice术语,(11)Direct Vs.Indirect Binding将Proxy解析为协议-地址对的过程称为绑定,direct binding用于direct proxy,indirect binding用于indirect proxy。Indirect binding的主要好处是允许我们移动服务器而不会使客户端持有的Proxy变为无效。(12)Fixed ProxyFixed Proxy和特定连接关联,包含一个连接句柄,一旦连接关闭,Proxy不再工作。Fixed Proxy
13、不能整编,也就是不能作为参数传递给方法调用。Fixed Proxy用于实现双向连接,允许服务端回掉客户端而不开启新的连接(36.7)。,1.2 Ice术语,(13)Routed ProxyRouted Proxy将所有请求转发到特定目标对象。它用于实现类似于Glacier2这样的服务,允许客户端和位于防火墙后的服务通信(42)。(14)Replication在Ice中,Replication包括使object adapter在多个地址上可用。Replication的目标通常是通过在多台计算机上运行同一个服务来提供冗余性。如果一台计算机失效了,其他还可用。,1.2 Ice术语,要使用replic
14、ation意味着应用程序必须为此而专门设计。这表示,当客户端能通过一个地址访问一个对象时,从其他地址也能获得相同结果。Ice支持一种有限形式的replication,通过在Proxy中指定多个地址,Ice运行时初始连接时随机选择一个地址,如果失败则会尝试其他地址,例如:SimplePrinter:tcp-h server1 p 10001:tcp-h server2-p 10002,1.2 Ice术语,(15)Replica Groups除了基于Proxy的Replication,Ice还支持一种称为Replica Groups的更有用的Replication形式,这种形式需要使用locati
15、on service。Replica Groups有一个唯一的标识,一旦一个Replica Groups建立后,可以通过indirect proxy的第二种形式(adapter标识替换为Replica Groups标识)进行访问。Replica Groups的好处是引入间接性,通过作为中间人的location service添加更多智能绑定过程。,1.2 Ice术语,(16)At-Most-Once SemanticsIce保证At-Most-Once Semantics语义,即请求要么发送出去,如果不能发送,会以合适的异常通知客户端。任何情况都不会出现请求被发送两次,重试的尝试只会出现在确切
16、的知道发送失败时(UDP例外)。虽然无At-Most-Once Semantics可构建更健壮的分布式应用程序,但现实情况是存在有副作用的方法,这些方法不能武断执行多次。如果方法无副作用,在Slice中可定义为idempotent,这样Ice就能做更多有益的错误恢复。,1.2 Ice术语,(17)Synchronous Method Invocation默认情况下,Ice使用的请求分派模型是同步远程过程调用,在调用过程中,客户线程会被阻塞,直到调用完成。(18)Asynchronous Method Invocation(AMI)Ice也支持异步方法调用:和同步调用不同的是,客户端传入额外的回
17、调对象,调用立即返回,当操作完成时,客户端运行时会调用回调对象以便返回操作结果。服务端是无法区分客户端是采用同步还是异步调用的。,1.2 Ice术语,(19)Asynchronous Method Dispatch(AMD)AMD是AMI在服务端的等价物。服务端默认情况下使用同步分派,分派线程同时负责应用代码的执行,一个操作执行完后,此线程才能处理其他请求。使用AMD,服务端可以控制分派的过程,当有请求到达时,服务端会收到通知,应用代码可以选择将请求放入用户队列然后释放分派线程,然后由用户线程对请求进行处理,并通过回调对象将结果返回给客户端。同样,客户端也无法区分服务端是同步分派还是异步分派。
18、,1.2 Ice术语,(20)Oneway Method Invocation 对于oneway invocation,客户端运行时将调用交给本地传输机制,一旦本机传输机制缓冲了请求,客户请求就完成了,实际请求随后由操作系统异步发送。服务端不会回应oneway invocation,也就是只有从客户端到服务端的数据流,相反方向则没有。Oneway invocation是不可靠的,但可以获得更高的效率。Oneway invocation只可用于没有返回值,没有输出参数,不会抛出用户异常的方法。对服务端而言,无法区分客户调用是oneway还是twoway的。Oneway只有在目标对象提供面向流的传
19、输机制,例如TCP/IP或SSL时才可用。尽管如此,Oneway invocation无法保证到达服务端的顺序和调用顺序一致,这取决于线程调度。,1.2 Ice术语,(21)Batched Oneway Mehtod InvocationBatched oneway invocation允许你以一条单一消息发送一系列oneway请求,从而提高效率,也能保证请求的顺序。(22)Datagram Invocation和Oneway invocation类似,不同的是:要求目标对象提供UDP传输机制;个别调用可能简单的丢失,例如依次进行3次调用,中间的调用可能丢失,但在oneway invocati
20、on中是不会发生的;个别调用可能无序到达,和oneway的失序不同,oneway是由于多线程引起,而datagram即使在单线程情况也会失序。,1.2 Ice术语,(23)Batched Datagram Invocation和Batched Oneway Invocation类似,需要注意的是批量消息的总大小不要超过PDU限制。(24)Run-Time ExecptionsIce运行时预定义的异常。(25)User Exceptions 用户自定义异常。(26)属性大多数Ice运行时行为可通过属性进行配置。属性以名-值对的形式出现,例如Ice.Default.Protocol=tcp。,1.
21、3 Ice架构,(1)客户端/服务器结构,1.3 Ice架构,(1)客户端/服务器结构Ice Core and API:远程通信的运行时支持Proxy Code:由Slice定义生成,负责将本地调用转化为RPC,同时负责序列化和反序列化。Skeleton:由Slice定义生成,是Proxy Code服务端的对应物;Object Adapter:Ice运行时的一部分,只有服务器会用到Adapter。,1.4 示例,(1)编写Slice定义并编译module Demo interface Printer void printString(string s);保存为Printer.ice,使用sli
22、ce2cpp进行编译后得到Printer.h和Printer.cpp,它们是服务端和客户端共用的。,1.4 示例,(2)编写服务端#include#include using namespace std;using namespace Demo;class PrinterI:public Printer public:virtual void printString(const string,1.4 示例,(2)编写服务端intmain(int argc,char*argv)int status=0;Ice:CommunicatorPtr ic;try ic=Ice:initialize(ar
23、gc,argv);Ice:ObjectAdapterPtr adapter=ic-createObjectAdapterWithEndpoints(SimplePrinterAdapter,default-p 10000);Ice:ObjectPtr object=new PrinterI;adapter-add(object,ic-stringToIdentity(SimplePrinter);,adapter-activate();ic-waitForShutdown();catch(const Ice:Exception,1.4 示例,(3)编写客户端#include#include u
24、sing namespace std;using namespace Demo;intmain(int argc,char*argv)int status=0;Ice:CommunicatorPtr ic;try ic=Ice:initialize(argc,argv);Ice:ObjectPrx base=ic-stringToProxy(SimplePrinter:default-p 10000);PrinterPrx printer=PrinterPrx:checkedCast(base);if(!printer)throw Invalid proxy;,printer-printStr
25、ing(Hello World!);catch(const Ice:Exception,2.Slice语言,2.1 Slice介绍2.2 Slice源文件2.3 词法规则2.4 Modules2.5 Slice基本类型2.6 User-Defined Types2.7 Interfaces,Operations,and Exceptions2.8 Classes2.9 Forward Declarations2.10 Type IDs2.11 Operations on Object2.12 Local Types2.13 Names and Scoping2.14 Metadata2.15
26、Serializable Objects2.16 Deprecating Slice Definitions2.17 Using the Slice Compilers2.18 Slice Checksums2.19 Generating Slice Documentation,2.1 Slice介绍,(1)Slice是什么Slice(Specification Language for Ice)是分离对象接口和实现的重要抽象机制。Slice建立了客户和服务器之间的契约,这些契约描述了应用所需的类型及对象接口。这些描述是中立与语言的,所以客户端和服务端可以使用不同的实现语言。Slice提供编译
27、工具将Slice定义编译为具体语言的实现代码,即客户端的Proxy code和服务端的Skeleton,这样用户只用把注意力放在业务逻辑的处理上。,2.1 Slice介绍,(2)开发模型服务端和客户端使用相同的开发环境,2.1 Slice介绍,服务端和客户端使用不同的开发环境,2.2 Slice源文件,(1)命名必须以ice为扩展名,对于大小写不敏感操作系统(如DOS、WINDOWS),扩展名大小写无关;对于大小写敏感操作系统(如Unix),扩展名必须为小写。(2)文件格式Slice是一个自由格式语言,你可以任意使用空格、水平和垂直制表符、换页符或换行符编排代码。Slice文件可以是ASCII
28、文本文件或者UTF-8编码文件(with BOM)。但是Slice标示符只能为ASCII字母和数字,非ASCII字符只用出现在注释中。,2.2 Slice源文件,(3)预处理 Slice使用C+预处理器进行预处理,所以可以使用常用预处理指令,如#include和宏定义。Slice只允许#include出现在文件开始,位于任何Slice定义之前。需要使用其他Slice文件中类型定义时,可以使用#include包含其他Slice文件,防止多重包含的技巧对Slice同样适用。编译器生成代码时,不会生成#include的Slice文件对应的代码,只会编译传入编译器命令行的文件。#include推荐用尖
29、括号而不用双引号,因为前者可以在编译时使用-I选项指定搜索路径,而后者对文件的定位方式会随操作系统而变化,常常不能按期望找到文件。#include文件包含路径时,只能用/,而不能用。,2.3 词法规则,(1)注释/*C-style comment*/C+-style comment(2)关键字bool enum implements module struct byte execption int Object throws class extends interface out true const false local sequence void dictionary float Loc
30、alObject short double idempotent long string,2.3 词法规则,(3)标识符标识符只能使用a-zA-Z0-9_中字符,并且必须以字母开头,不能以下划线开头或结尾,不能包含连续的下划线。标识符是大小写无关的但是必须保持大小写一致性,例如TimeOfDay和TIMEOFDAY在一个名字作用域内是相同的标识符,但是Slice强制大小写一致性,一旦引入一个标识符,就必须保持大小写一致,否则编译器认为非法。可以使用实现语言(C+、Java)中的关键字作为标识符,编译器会自动添加前缀,例如switch在C+中会映射为_cpp_switch,在Java中会映射为_
31、switch。应尽量避免这种情况。也可以使用Slice关键字作为标识符,但必须前加,对于普通标识符也可在前面加,这种情况加和不加没有区别。有些标识符是保留的,不允许使用:标识符Ice、以Ice(大小写无关)开头的标识符、以Helper、Holder、Prx、Ptr为后缀的标识符。,2.4 Modules,module是用于缓解名字冲突的,编译后C+中映射为namespace,Java中映射为package。module可以包含任何合法Slice成分,包括其他module。Slice要求所有定义必须嵌入module中,不允许在全局作用域中定义任何东西。module可以重新打开,例如:module
32、 ZeroC/definitions here;/Possibly in a different source file:module ZeroC/more definitions here;,2.5 Slice基本类型,2.6 User-Defined Types,(1)Enumerations和C+语法类似:如enum Fruit Apple,Pear,Orange;定义了枚举类型Fruit。Slice没有定义枚举值的数值,所以不能假定Orange为2,同时也不能像C+那样指定枚举值,所以不要在枚举值和数值间转换,客户端发送枚举值时直接使用枚举,如Apple。和C+类似,枚举名字不会限制在
33、花括号作用域内,不能重定义相同的名字,例如Apple不能出现在另一个枚举定义中。Slice不允许空枚举。,2.6 User-Defined Types,(2)StructuresSlice支持结构体包含一个或多个命名的任意类型成员,例如:struct TimeOfDayshort hour;short minute;short second;和枚举不同,结构体形成名字空间,所以其中的成员名字只需要在结构体中唯一。结构体内除了命名的类型成员外不能包含其他成员,例如不能在结构体内部再定义结构体(更一般的在Slice中类型不能嵌套定义),结构体的基本类型及枚举成员可以有一个初始值,例如:struct
34、 Locationstring name;Point pt;bool display=true;string source=“GPS”;,2.6 User-Defined Types,(3)SequencesSequences是包含可变个数任意相同类型元素的集合。定义方法例如:sequence FruitPlatter;这样就定义了新的序列类型FruitPlatter。在C+中sequence被映射为std:vector。Sequence的一个惯用法是用作可选值,例如某个字段为string类型,我们是无法知道此字段是否有值的,如果将此字段类型定义为sequence,那么就可以用序列为空表明没有
35、值。,2.6 User-Defined Types,(4)DictionariesDictionary用于定义键类型到值类型的映射,从而方便查找,定义方法如:dictionary WeekdaysEnglishToGerman;就定义了类型WeekdaysEnglishToGerman。C+中dictionary被映射为std:map。注意dictionary的键类型只能为整形(包括枚举)、string或只包含整形、string的结构体,值类型可为任意类型。,2.6 User-Defined Types,(5)Constant Definitions and LiteralsSlice允许定义
36、基本类型及枚举类型的常量。如:const bool AppendByDefault=true;const byte LowerNibble=0 x0f;const string Advice=“Dont Panic!”;Slice字面常量语法和C+是基本一致的。只有少数差别,如不支持用于表明long和unsigned的后缀(l,L,u,U),可用l或L后缀表明扩展精度浮点数。,2.7 Interfaces,Operations,and Exceptions,(1)Interface前面已经讲过Interface的概念,Interface的定义方法如:Interface ClockTimeOfD
37、ay getTime();void setTime(TimeOfDay time);Interface中除了方法不能包含其他任何东西,Interface可以看作C+中类定义的公有部分或Java interface,而方法可以看作(虚拟)成员函数。,2.7 Interfaces,Operations,and Exceptions,(2)Parameters and return values方法有一个返回值和0或多个参数,例如:void Fun(int i,out string str);如果方法不返回值,用void表明;参数分输入参数和输出参数,输出参数用out关键字标识,out参数必须位于输
38、入参数之后;参数名不能省略;不支持输入输出参数。,2.7 Interfaces,Operations,and Exceptions,(3)重载Slice不支持任何形式的重载。一个接口中的方法名必须不同。(4)Idempotent Operations前面讲过Ice使用at-most-once语义,避免方法被执行多于一次,但是有些时候重复执行一个方法是无害的,例如x=1,重复执行是没有问题的,这时可以将方法定义为idempotent,这样Ice就可以做更多积极的尝试恢复错误,使得应用毫无察觉,提高系统的健壮性和鲁棒性。定义idempotent方法如下所示:interface Clockidemp
39、otent TimeOfDay getTime();idempotent void setTime(TimeOfDay time);,2.7 Interfaces,Operations,and Exceptions,(5)User Execptions除了Ice runtime定义了一系列异常,用户还可以定义自己的异常,自定义的异常由服务端产生,传递到客户端,异常的定义类似于结构体,但是可以为空。例如:exception Error;execption RangeErrorTimeOfDay errorTime;TimeOfDay minTime;TimeOfDay maxTime;和结构体一
40、样,可以为基本类型和枚举类型成员设置初始值,需要产生异常的方法必须通过异常规范列出,例如:interface Clockidempotent TimeOfDay getTime();idempotent void setTime(TimeOfDay time)throws RangeError,Error;方法不能抛出未列在异常规范中的异常,否则Ice运行时会抛出异常;如果方法不抛出异常,只要删除异常规范列表。异常不能当成第一类数据类型,第一类数据类型也不能当成异常。,2.7 Interfaces,Operations,and Exceptions,(6)Exception Inheritan
41、ce异常是可以继承的,例如:Exception ErrorBasestring reason;Exception RuntimeError extends ErrorBase;方法的异常规范列表中可以只列出基类异常,这样方法内可以抛出所有基类和子类异常;异常只支持单继承。,2.7 Interfaces,Operations,and Exceptions,(7)Ice Run-Time Exceptions,2.7 Interfaces,Operations,and Exceptions,(8)Interface Semantics and Proxiesinterface经过编译后会自动生成客
42、户端proxy和服务端骨架,在Slice中interface后跟“*”表示proxy,例如:module Demoexception BadZoneName;interface Clock;interface WorldTimeidempotent void addZone(string zoneName,Clock*zoneClock);idempotent Clock*findZone(string zoneName)throws BadZoneName;“*”表示proxy operator,其左边必须为一个interface。Clock*表示Clock接口的代理。上述Slice编译成C
43、+后是:,2.7 Interfaces,Operations,and Exceptions,(8)Interface Semantics and Proxiesnamespace IceProxynamespace Democlass Clock:virtual public:IceProxy:Ice:Object;class WorldTime:virtual public:IceProxy:Ice:Object;namespace Demotypedef:IceInternal:ProxyHandle ClockPrx;typedef:IceInternal:ProxyHandle Wor
44、ldTimePrx;上述生成代码为客户端proxy,客户端通过ClockPrx和WorldTimePrx访问服务端对象。,2.7 Interfaces,Operations,and Exceptions,(8)Interface Semantics and Proxiesnamespace Democlass Clock:virtual public:Ice:Object;class WorldTime:virtual public:Ice:Objectpublic:virtual void addZone(const:std:string上述生成代码为服务端skeleton,需要从Clock
45、和WorldTime继承,实现其接口。,2.7 Interfaces,Operations,and Exceptions,(9)Interface Inheriance接口支持继承,也支持多继承,菱形继承也是允许的。例如:interface B/*/;interface I1 extends B/*/;interface I2 extends B/*/;interface D extends I1,I2/*/;接口继承的限制是,多个基类中不能有同名的方法。所有接口隐式继承于Ice:Object接口,不允许显示从其继承。因此Object可以作为任何接口使用,例如:interface ProxyS
46、toreidempotent void putProxy(string name,Object*o);idempotent Object*getProxy(string name);,2.7 Interfaces,Operations,and Exceptions,(10)Self-Referential Interfaces由于proxy有指针语义,所以我们可以定义自引用接口,如:interface Linkidempotent SomeType getValue();idempotent Link*next();(11)Empty Interfaces空接口是合法的。但大多数时候,空接口表
47、明一种设计错误。,2.8 Classes,class可以同时包含数据成员和方法。(1)Simple Classes除去可以包含方法,class的定义和struct基本是一样的,除了class可以为空。另外Class还包含如下特性。(2)class inheritanceclass还可以支持继承,使用extends关键字。和接口继承不一样,class只支持单继承,同样是子类不能重定义基类成员。,2.8 Classes,(3)Class Inheritance Semanticsclass和structures一样也是用传值语义,不同的是由于继承的原因,在需要基类参数的地方可以传递子类参数,如果接
48、收者知道子类的静态类型,它会接收到子类型的全部信息,否则会切片为基类类型。通过type ID可以将接收的基类类型转化为实际的运行时子类型。(4)Classes as Unions运用上述特性,可以实现Union的语义。,2.8 Classes,(5)Self-Referential Classesclass可以自引用,例如:module Testclass Linkint value;Link next;编译为C+后得到:namespace Testclass Link;typedef:IceInternal:Handle LinkPtr;class Link:virtual public:I
49、ce:Object,private IceInternal:GCSharedpublic:Ice:Int value;:Test:LinkPtr next;,2.8 Classes,(6)Classes Versus Structuresclasses提供如下structures没有的特性:支持继承、可自引用、可以包含操作、可以实现接口。当然这些必然需要一些代价,如生成代码大小及运行时内存及CPU开销。使用者必须进行权衡。(7)classes with operationsclass中可以包含方法,语法和Interface中相同,但是class中的方法是local的,不会导致远程过程调用。当在
50、服务端和客户端间传递一个class实例时,Ice运行时只会序列化class的数据成员,如果class中包含方法,接收方要提供类工厂在接收方的地址空间中实例化类。,2.8 Classes,(8)Architectural Implications of classes使用包含操作的类实际上就使用了客户端本地代码,因此,就无法享受Interface所提供的实现透明性。这意味着包含操作的类只能用在客户端开发环境进行紧密控制的情况,否则不要使用包含操作的类。(9)Classes Implementing Interfaces和Java的语法类似,class可以使用implements关键字实现inte