【IT168技术文档】
Slice 类映射到同名的C# 类。对于每一个Slice 数据成员,生成的类都有一个对应的public 数据成员(就像结构和异常的情况),而每一个操作都有一个对应的成员函数。考虑下面的类定义:
Slice 编译器为这个定义生成这样的代码:class TimeOfDay { short hour; // 0 - 23 short minute; // 0 - 59 short second; // 0 -59 string format(); // Return time as hh:mm:ss };
关于生成的代码,注意以下几点:public interface TimeOfDayOperations_ { string format(Ice.Current __current); } public interface TimeOfDayOperationsNC_ { string format(); } public abstract class TimeOfDay : Ice.ObjectImpl, TimeOfDayOperations_, TimeOfDayOperationsNC_ { public short hour; public short minute; public short second; public TimeOfDay() { } public TimeOfDay(short hour, short minute, short second) { this.hour = hour; this.minute = minute; this.second = second; } public string format() { return format(new Ice.Current()); } public abstract string format(Ice.Current __current); }
1. 编译器生成了叫作 TimeOfDayOperations和TimeOfDayOprationsNC_的操作接口。对于类中的每一个 Slice 操作,在操作接口中都有一个对应的方法。
2. 生成的类继承自Ice.Objet,这意味着所有的类默认继承自Ice.Object,Ice.Object是所有类的祖先,注意Ice.Object不同于Ice.ObjectPrx,也就是说,你不能在应该传递代理的地方使用class实例,反之亦然。
如果一个类只有数据成员,没有操作,则Slice2C#编译器生成一个非虚类(non_abstract class).
3. 编译器生成的类为每个slice数据成员生成了一个公共数据字段。
4. 编译器生成的类从操作接口中继承了所有成员函数。
5. 编译器生成的类拥有两个构造函数
上面只是简短的说了一下,下面让我们来详细的说明一下每个部分。
操作接口
<interface-name>Operations_功能接口中的方法都有一个附加的Ice.Curreet类型的参数,而在<interface-name>OprationsNC_功能接口中的方法则都没有这个参数。对于没有显式指定Ice.Current类型参数的方法,它其实有一个默认的Ice.Current参数。
如果一个类只有数据成员,而没有方法,那么编译器将不会生成上面所说的两个操作接口。
继承自Ice.Object
像接口一样,所有的类都隐式的继承自一个公共基类Ice.Object.,类继承自Ice.Object而不是Ice.ObjectPrx(接口继承自Ice.ObjectPrx)。所以,你不能在期望得到代码的地方指定一个类,反之亦然,这是因为他们的基类型是不兼容的。
Ice.Object的定义如下:
namespace Ice { public interface Object : System.ICloneable { int ice_hash(); bool ice_isA(string s); bool ice_isA(string s, Current current); void ice_ping(); void ice_ping(Current current); string[] ice_ids(); string[] ice_ids(Current current); string ice_id(); string ice_id(Current current); void ice_preMarshal(); void ice_postUnmarshal(); } }
* ice_hash 这个方法返回类的哈希键。 * ice_isA 这个方法当对象支持给定的类型ID时返回true,否则返回false. * ice_ids 这个方法返回类在运行时的真正类型ID, * ice_preMarshal Ice run time在整编一个对象的状态前会调用这个方法,这就给子类提供了一个验证数据成员的机会。 * ice_postUMarshal Ice run time在解编一个对象的状态后,会调用这个方法。如果子类希望执行附加的初始操作的话,可以重写这个方法。 注意,生成的类并没有重写GetHaseCode和Equals方法,这意味着类之间的比较是比较引用,而不是比较值。另外类还有提供了浅copy功能的Clone方法。