TTCN3新执行器系列-实现类型兼容问题
来源:互联网 发布:淘宝618是什么时候 编辑:程序博客网 时间:2024/05/17 04:14
ttcn3语言有类型兼容这样一个概念,主要用于赋值情况。
最简单就是简单类型兼容,如integer类型,
由于ttcn3的integer属于内建类型,但同时你可以在asn文件中重定义并加上范围限制。
于是,一般的asn文件定义的integer类型是非常多的,可以有数十种之多。
如果我们把ttcn3内建的integer看做是基类,则asn重定义的应该就是派生类了。
因为我们的新执行器是基于C++实现的,所以也看看C++的情况。
以函数形参来举例,我们支持值传递和引用传递方式(指针传递实际是值传递)。
如果是值传递,
1、形参是派生类,实参是基类,这要求派生类提供一个带基类的构造函数。
2、形参是基类,实参是派生类,这是危险的处理,会导致类型截取操作。
3、形参是派生类A,实参是派生类B?
如果是引用传递
1、形参是派生类引用,实参是基类?
2、形参是基类引用,实参是派生类,这是使用很多的用法。
3、形参是派生类A引用,实参是派生类B?
由于C++是强类型的语言,所以要处理类似这样的问题,建议使用引用传递的方案1。
但正如C++一样,ttcn3语言对于形参,可以使用in或者out的方式,也就是用户有权利选择值传递和引用传递。
但值传递是很难处理兼容性问题的。。。
更麻烦的是,ttcn3以out方式操作时,形参和实参的类型不一致的情况。
因为out方式就是C++的引用传递,值在函数内部的改变,需要带出到函数外部中。
所以,单单依靠纯C++语言的构造函数功能,是无法支持上述功能实现的。
这个问题的最后解决,得益于软件开发的一句真理名言:任何技术问题都可以通过中间量方式进行解耦实现。
于是,我们想出使用CInParam和COutParam类来实现参数in和inout方式,
因为形参的类型T是非常重要的,不能丢失,所以这两个类实现为模板类,用于保留形参的T信息。
这样,在实参和形参中间,增加了这样一个封装处理,操作起来就简单多了。
我们可以在类中对形参和实参的类型进行检测,如果不一致,则:
对于in值传递类型,需要生成一份形参实体,然后通过实参来赋值之;
对于out引用传递类型,需要生成一份形参实体,然后通过实参赋值之,在函数结束时反赋值为实参;
我们把大量逻辑处理工作都通过类的方式封装起来了,
外部看起来代码相对简洁,通过能处理各种各样的类型兼容问题,无论是in还是out方式。
当然,类型兼容情况,是会导致性能损耗情况的(内部会有新建和销毁临时实体的动作),
但这应该是用户需要关心的问题,如果用户确实有这个需要,那我们能实现功能就是了,不应该过分强制这个或那个。
C++语言的三个核心,封装、继承和多态,我觉得封装是更基础的。
现在boost的bind和function能很好的实现继承和多态的问题,也印证了这点。
- TTCN3新执行器系列-实现类型兼容问题
- TTCN3新执行器系列-实现简单的反射机制
- TTCN3新执行器系列-说说基于TTCN3代码行的调试器实现
- TTCN3新执行器系列-序
- TTCN3新执行器系列-对component的理解
- TTCN3新执行器系列-合理映射runson语义
- TTCN3新执行器系列-尽量远离template
- TTCN3新执行器系列-说说C++的编译速度
- TTCN3新执行器系列-对线程组件PTC的理解
- TTCN3新执行器系列-谈谈几次伤筋动骨的重构工作
- TTCN3新执行器系列-端口操作的接口简单化重构
- TTCN3新执行器系列-如何最小化类的成员函数(对拷贝构造和赋值操作函数的反思)
- TTCN3本身的类型
- JDK5.0新特性系列 使用ProcessBuilder执行本地命令
- C# 3.0新特性系列:隐含类型var
- C# 3.0新特性系列:隐含类型var
- C# 3.0新特性系列:隐含类型var
- C# 3.0新特性系列:隐含类型var
- c++ 编写xml操作类
- 测试人员的培养过程-3
- c++/cli 托管 非托管类型 转换 marshal_as(vs2008) marshal_to(vs2005)
- 中断
- Linux--TCP/IP/UDP/ICMP协议头结构
- TTCN3新执行器系列-实现类型兼容问题
- 啟動團隊高績效循環,4步驟!
- ArcGIS API for Flex入门 - 1.概述
- ArcGIS API for Flex 配置使用(图片没有了)
- ArcGIS API for Flex 概览
- ArcGIS API for Flex入门 - 2.配置开发环境和HelloWorld
- 在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享
- Java 常用数据结构深入分析(Vector、ArrayList、List、Map)
- --附加数据库失败