编辑“︁
Modula-3
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
===子类型规则=== 使用<code>T <: U</code>指示<code>T</code>是<code>U</code>的[[子类型]],也就是<code>U</code>是<code>T</code>的超类型。子类型规则是:如果<code>T <: U</code>,则类型<code>T</code>的所有值,都是类型<code>U</code>的值,反过来则不成立。 对于[[序数]]类型<code>T</code>和<code>U</code>,<code>T <: U</code>的条件为,它们拥有相同的基础类型,并且所有的<code>T</code>的成员都是<code>U</code>的成员。就是说序数类型上的子类型,反映了在值[[集合 (数学)|集合]]上的[[子集]]关系。 对于[[数组]]类型,一个数组类型<code>A</code>是一个数组类型<code>B</code>的子类型的条件为,它们有相同的最终元素类型,相同的维度数,并且对于每个维度,要么二者都是开放的,要么<code>A</code>是固定的而<code>B</code>是开放的,要么它们都是固定的并有着相同的大小。 对于[[子程序|过程]]类型,<code>T <: U</code>的条件为,它们除了形式参数名字、缺省值和<code>RAISES</code>集合之外是相同的,并且<code>T</code>的<code>RAISES</code>集合包含在<code>U</code>的<code>RAISES</code>集合中。<code>NIL</code>是所有的过程类型的一个成员。 对于[[位段|压缩]]类型,<code>BITS n FOR T</code>和<code>T</code>有相同的值,也就是说:<code>BITS n FOR T <: T</code>并且<code>T <: BITS n FOR T</code>。 对于[[集合 (数学)|集合]]类型<ref name="type" />,<code>SET OF A <: SET OF B</code>的条件是<code>A <: B</code>,就是说集合的子类型规则简单的使用值集合规则。 对于[[参照|引用]]类型有: <syntaxhighlight lang="objectpascal"> NULL <: REF T <: REFANY NULL <: UNTRACED REF T <: ADDRESS </syntaxhighlight> 就是说,<code>REFANY</code>和<code>ADDRESS</code>分别包含所有的有跟踪的和无跟踪的引用,<code>NIL</code>是所有的引用类型的一个成员。这两个规则也适用于加铭牌的类型。 对于[[对象 (计算机科学)|对象]]类型有: <syntaxhighlight lang="objectpascal"> ROOT <: REFANY UNTRACED ROOT <: ADDRESS NULL <: T OBJECT ... END <: T </syntaxhighlight> 就是说,所有对象都是引用,<code>NIL</code>是所有的对象类型的一个成员,而所有的子类型都包括在它的超类型之中。第三个规则也适用于加铭牌的类型。 对于所有的<code>T</code>,都有<code>T <: T</code>。对于所有的<code>T, U, V</code>,<code>T <: U</code>[[逻辑与|并且]]<code>U <: V</code>,[[蕴涵]]<code>T <: V</code>。就是说<code><:</code>是[[自反关系|自反]]和[[传递关系|传递]]的。但是<code>T <: U</code>并且<code>U <: T</code>,不蕴涵<code>T</code>与<code>U</code>是相同的,因为子类型关系不受形式参数名字、缺省值和压缩的影响。 ====可赋值性==== 一个类型<code>T</code>可[[赋值语句|赋值]](assignable)给类型<code>U</code>的条件是: *<code>T <: U</code>,或者 *<code>U <: T</code>并且<code>T</code>是一个数组或除了<code>ADDRESS</code>之外的一个引用类型(这个限制在不安全模块中解除),或者 *<code>T</code>和<code>U</code>是至少有一个共同成员的序数类型。 在第一种情况下,没有运行时间错误是有可能的。在第二种情况下,允许赋值一个<code>REFANY</code>到一个<code>REF T</code>,还允许赋值一个<code>ARRAY OF T</code>到一个<code>ARRAY I OF T</code>,这里分别要求对引用的类型和数组长度的运行时间检查;可以使用类型运算<code>NARROW(x, T): T</code>,将对象类型或有跟踪的引用类型的超类型变量当作其子类型的成员,这时需要运行时间检查,{{le|Modula-2+}}介入它就是为了以安全的方式,将<code>REFANY</code>变量赋值给确知的实际类型<code>REF T</code>。在第三种情况下,常规的范围检查就能确保特定的<code>T</code>的成员也是<code>U</code>的成员。 一个表达式<code>e</code>可赋值给一个变量<code>v</code>的条件是: *<code>e</code>的类型可赋值给<code>v</code>的类型,并且 *<code>e</code>的值是<code>v</code>的类型的一个成员,它不是一个局部过程,并且如果它是一个数组,则有同<code>v</code>一样的形状。 一个表达式<code>e</code>可赋值给类型<code>T</code>,如果<code>e</code>可赋值给类型<code>T</code>的某个变量。如果<code>T</code>不是一个开放数组,这等同声称<code>e</code>可赋值给类型<code>T</code>的任何变量。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息