能否在COBOL中定义对象引用表?实现及替代方案问询
COBOL中对象表的定义可行性及替代方案
核心结论
根据最新COBOL标准,确实无法直接定义由01级对象引用组成的表——因为对象引用(OBJECT REFERENCE类型)必须定义在01级,而表(OCCURS子句)只能用于01级以下的数据项,两者的语法限制冲突,直接的对象表因此不被允许。
替代方案(模拟List<T>的泛型列表效果)
如果你想实现类似List<T>的通用对象列表功能,可以通过以下几种方式绕过限制:
用指针数组间接存储对象引用
将对象引用转换为通用指针(POINTER类型)存储在表中,使用时再转换回对象引用,示例代码:* 定义指针表 01 PTR-TABLE. 05 OBJ-PTR OCCURS 100 TIMES USAGE POINTER. * 存储对象引用到表中 SET OBJ-PTR(I) TO ADDRESS OF TARGET-OBJ-REF. * 从表中取出并转换为对象引用 SET TARGET-OBJ-REF TO OBJECT REFERENCE ADDRESS OBJ-PTR(I).封装容器类实现列表逻辑
创建一个专用的容器类,在类内部管理对象引用的数组,并对外提供添加、删除、访问等方法,模拟List<T>的封装特性,示例代码:CLASS GENERIC-OBJECT-LIST. DATA DIVISION. WORKING-STORAGE SECTION. 01 INTERNAL-DATA. 05 LIST-COUNT PIC 9(4) COMP VALUE 0. 05 OBJECT-ENTRIES OCCURS 1000 TIMES. 10 OBJ-REF OBJECT REFERENCE TO BASE-OBJECT-CLASS. PROCEDURE DIVISION. METHOD ADD-OBJECT USING NEW-OBJ OBJECT REFERENCE TO BASE-OBJECT-CLASS. ADD 1 TO LIST-COUNT SET OBJECT-ENTRIES(LIST-COUNT) TO NEW-OBJ END METHOD. METHOD GET-OBJECT USING INDEX-VAL PIC 9(4) RETURNING RESULT-OBJ OBJECT REFERENCE TO BASE-OBJECT-CLASS. SET RESULT-OBJ TO OBJECT-ENTRIES(INDEX-VAL) END METHOD. END CLASS.这里的
BASE-OBJECT-CLASS可以是你需要存储的对象类的基类,实现类似泛型的多态存储。利用编译器扩展(如果可用)
部分COBOL编译器对标准有扩展,允许在非01级定义对象引用。如果你的编译器支持这一特性,可以直接用组项包裹对象引用定义表:01 OBJECT-LIST. 05 LIST-ENTRY OCCURS 100 TIMES. 10 OBJ-REF OBJECT REFERENCE TO TARGET-CLASS.具体需参考你使用的编译器文档确认支持情况。
内容的提问来源于stack exchange,提问作者KTSnowy
相关产品推荐
相关产品推荐

