我试图弄清楚 Oberon 是否允许对记录中的字段进行寻址,该字段在所述记录的类型声明中不存在,但仅在其扩展之一中,并且在没有类型保护的情况下这样做。
在 PIO (" Programming in Oberon ") 第 62 页,第一段的最后一句,Wirth 写道 (1):
我们对面向对象编程范式的简要介绍到此结束。我们意识到几乎不需要向 Oberon 添加任何语言功能来支持它。除了已经存在的记录和过程类型的设施之外,只有类型扩展的概念是必要和关键的。它允许构建类型的层次结构并构建非同质的数据结构。由于放弃了严格静态类型的规则,动态类型测试的引入变得必要。类型保护的进一步设施仅仅是一种方便。
在 PIO 第 59 页,第 23.2 节之前最后一段的前三句话,他写道 (2):
简单的指示符 p.radius 是不可接受的,因为 p 是 Figure 类型,它没有场半径。使用类型保护,程序员可以确定在这种情况下 p 也是 Circle 类型,在这种情况下,字段半径确实适用。而 p 是基本类型Figure,p(Circle) 是 Circle 类型。
一方面,我将 #2 解释为,为了能够处理不在指示符类型声明中的字段,类型保护是绝对必要的。如果不是类型保护,寻址这样的字段应该会导致编译时错误。
另一方面,如果类型保护只是如#1 所建议的那样方便,那么它也可以被省略。它的功能只是断言的功能,因此编译器可以允许对不在指示符类型声明中的字段进行寻址。
由于后者不是类型安全的,如果 Wirth 是这样打算的,我会感到惊讶。
因此,我倾向于完全无视#1并实施#2。
在我通过电子邮件打扰 Wirth 之前,如果 Oberon 的从业者(和编译器实现者)可以分享在他们各自的 Oberon 编译器中是如何解释的,我将不胜感激。
提前致谢