编辑“︁
Modula-3
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
===不透明类型及其披露=== [[不透明数据类型|不透明]](opaque)类型声明有如下形式:{{code|2="modula2"|1=TYPE T <: U}},这里的<code>T</code>是标识符,而<code>U</code>是指示一个引用类型的表达式。它将名字<code>T</code>介入为不透明类型,并披露了<code>U</code>是<code>T</code>的超类型。 Modula-3的揭示(revelation)机制,将关于一个不透明类型的信息,介入到一个[[作用域]]之内,不同于其他声明,揭示不介入新的名字。不同的作用域,可以披露(reveal)关于一个不透明类型的不同的信息。例如,某个不透明类型,在一个作用域内知晓为<code>REFANY</code>的子类型,在其他的作用域内可以知晓为<code>ROOT</code>的子类型。 不透明类型名字所指示的实际类型叫做具体类型。<code>T</code>的具体类型,必须披露于程序的其他地方。在对象声明中,如果<code>ST</code>被声明为不透明类型,则只在知晓<code>ST</code>的具体类型为对象类型的作用域内,<code>T</code>的声明是合法的。如果<code>T</code>被声明为不透明类型,则只在完全知晓<code>T</code>的具体类型,或者知晓它为对象类型的作用域内,<code>NEW(T)</code>是合法的。 揭示分为两种:部份的和完全的,一个程序可以包含一个不透明类型的任意多个部份揭示,但必须包含唯一的一个完全揭示。 部份揭示有如下形式:{{code|2="modula2"|1=REVEAL T <: V}},这里的<code>V</code>是类型表达式(可能就是个名字),而<code>T</code>是被声明为不透明类型的一个标识符(可能有限定)。它披露了<code>V</code>是<code>T</code>的超类型。在任何作用域内,对一个不透明类型披露的超类型,必须是在子类型关系下是线性有序的。就是说,如果披露了<code>T <: U1</code>和<code>T <: U2</code>,则必须也要披露要么<code>U1 <: U2</code>要么<code>U2 <: U1</code>。{{code|2="modula2"|1=REVEAL T <: T}}是合法的非递归声明。 完全揭示有如下形式:{{code|2="modula2"|1=REVEAL T = V}},这里的<code>V</code>是类型表达式(不能就是个名字),它的最外层[[类型构造子]],是有铭牌的一个引用或对象类型,而<code>T</code>是被声明为不透明类型的一个标识符(可能有限定)。这个揭示指定了<code>V</code>是<code>T</code>的具体类型。在任何作用域内,披露为<code>T</code>的超类型的任何类型,都必须是<code>V</code>的超类型,否则是一个静态错误。不同的不透明类型有不同的具体类型,因为<code>V</code>包含了一个铭牌并且在程序中所有的铭牌都是独一的。{{code|2="modula2"|1=REVEAL I.T = I.T BRANDED OBJECT ... END}}是非法的递归声明。 揭示只允许用在接口和模块的最外层[[作用域]]内。在接口中的揭示可以被导入到任何需要它的作用域之内。揭示提供了向客户隐藏实现细节的,在概念上简单清晰却非常强力的机制,例如: <syntaxhighlight lang="objectpascal"> INTERFACE I; TYPE T <: ROOT; PROCEDURE P(x: T): T; END I. INTERFACE IRep; IMPORT I; REVEAL I.T = MUTEX BRANDED OBJECT count: INTEGER END; END IRep. INTERFACE IClass; IMPORT I; REVEAL I.T <: MUTEX; END IClass. </syntaxhighlight> 导入<code>I</code>的编译单元见到的<code>I.T</code>是<code>ROOT</code>的不透明子类型,因而被限制为可以分配类型<code>I.T</code>的对象,把它们传递给<code>I.P</code>,或声明<code>I.T</code>的子类型。导入<code>IRep</code>的编译单元见到的<code>I.T</code>是具体类型,它是有扩展的<code>count</code>字段的<code>MUTEX</code>的子类型。导入<code>IClass</code>的编译单元见到的<code>I.T</code>是<code>MUTEX</code>的不透明子类型,因而可以锁定类型<code>I.T</code>的对象。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息