网络服务器软件开发/中间件开发,关注ACE/ICE/boost

C++博客 首页 新随笔 联系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
         ICE中是没有union类型的,在帮助文档中“The Slice Language”一章的class部分有专门介绍,在ICE看来,union是多余的,可以通过类的继承方式来实现,估计也和union类型在不同语言间的映射很难做到同一有关,按照classs as unions的思路尝试了一下,感觉不是太方便,还不如用“组合”的方式来替代union。    下面是接口文件
   

#ifndef ATTR_ICE
#define ATTR_ICE

module Attribute
{
    
enum eAttrType
    
{
        AttrTypeString,
        AttrTypeInteger,        
    }
;

    
class AttrType;
    
class SAttr;
    
class NAttr;    
    
class Attr;
    
    sequence
<Attr> AttrList;
    
    
interface IUnion
    
{
        AttrList    GetAttr();        
    }
;
    
    
//ice本身不提供union类型,可以通过类的继承来模拟该功能
    
    
class AttrType
    
{
        
byte type;//属性类型,1:int,2:string
    }
;
    
    
class SAttr extends AttrType
    
{
        
string value;
        
//其它信息
    }
;
    
    
    
class NAttr extends AttrType
    
{
        
int      value;
        
//其它信息
    }
;    
    
    
class Attr
    
{
        
//AttrType type;
        SAttr    sa;
        NAttr     na;
    }
;
    
}
;
        

#endif


基本思路是,每个union的成员继承一个共同的基类,该基类包含类型信息,说明该成员是否是当前有效的成员。示例中,AttrType是一个基类,其中的type表示是整形属性,还是字符串属性,SAttr和NAttr分别继承自AttrType,因此都含有type的类型信息。Attr就是“union”类型,有sa和na两个成员,如果sa的type是string类型,则说明sa有效,NAttr类似。
在client端,会有下面类似的区分代码:
   
SAttrPtr sa = pAttr->sa;
            NAttrPtr na 
= pAttr->na;


            
if (sa->type == AttrTypeString)
            
{
                cout 
<< "string attr: " << sa->value << endl;
            }

            
else if (na->type == AttrTypeInteger)
            
{
                cout 
<< "int attr : " << na->value << endl;
            }
                    


这种模拟union的方式,好处是,在形式上和union类似,sa和na有一个成员有效,不过,个人认为,如果这样使用union还不如通过组合方式,在Attr中设置第一个成员为AttrType,SAttr和NAttr不再继承自AttrType,client根据该类型,来确定是取sa,还是na,当然,这在形式上不再是union了。

开发环境:VS2005 + ICE3.3.1。/Files/true/Union.zip

posted on 2010-10-03 14:31 true 阅读(1769) 评论(1)  编辑 收藏 引用 所属分类: ICE

Feedback

# re: ICE用class的继承方式来表达union类型 2010-10-12 11:09 陈梓瀚(vczh)
这么写是为了节省“内存空间的增长”  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理