Ada中能否将访问常量定义为通用访问类型的子类型?
问题描述
我们可以通过定义子类型来排除空值的访问类型,示例代码如下:
type Day_Of_Month_Access is access Day_Of_Month; subtype Day_Of_Month_Not_Null_Access is not null Day_Of_Month_Access;
但目前找不到任何关于定义移除读写权限的访问类型子类型的参考资料,比如下面这个虚构的语法示例:
type Day_Of_Month_Access is access all Day_Of_Month; subtype Day_Of_Month_Constant_Access is Day_Of_Month_Access with Access_Constant;
请问这种子类型在当前Ada中是否无法实现?原因是什么?
解答
这种通过子类型将可读写访问类型转为只读的方式无法实现,核心原因在于Ada的类型系统设计:
- 子类型的本质是对原类型的值约束,只能限制原类型的取值范围(比如非空访问类型是约束了访问值不能为
null),但无法修改原类型的固有属性。 - 访问类型的读写权限(
access all对应可读写,access constant对应只读)是类型定义时的固有特性,属于类型本身的一部分,并非值层面的约束,因此无法通过子类型来改变。
- 子类型的本质是对原类型的值约束,只能限制原类型的取值范围(比如非空访问类型是约束了访问值不能为
在Ada中,若需要只读的访问类型,正确的做法是直接定义
access constant类型,而非通过子类型转换:type Day_Of_Month is range 1..31; -- 定义只读访问类型 type Day_Of_Month_Constant_Access is access constant Day_Of_Month; -- 定义可读写访问类型 type Day_Of_Month_Access is access all Day_Of_Month;这两种是完全独立的类型,而非子类型关系;
Day_Of_Month_Access类型的对象不能直接赋值给Day_Of_Month_Constant_Access(反之可以,因为只读是更严格的权限),但可以通过显式转换或合适的上下文实现兼容。
内容的提问来源于stack exchange,提问作者Gneuromante
相关产品推荐
相关产品推荐

