我是 Eiffel 的新手,我试图了解“原始”类型(例如,INTEGER_32、REAL_64 等)是如何实现的。我对 EIFFEL 库类源文件中看似循环的依赖感到困惑。
原始类型被实现为非扩展父类的“扩展”版本。例如,INTEGER_32 是 INTEGER_REF_32 的扩展子代。(请注意,“扩展”并不意味着“实例”。扩展类是一个类,而不是一个对象。)
INTEGER_REF_32包含一个扩展 INTEGER_32 的实例。在 INTEGER_REF_32 对象中的某处必须有一个扩展整数是有道理的,但这意味着父级包含其子级的实例。
当您查看功能的定义时,它会变得更加混乱:
在 INTEGER_32 中,名为“as_integer_64”的特征/方法被简单地重新定义为“Result := Precurser”,其中 Precurser 意味着使用父级的特征。在父代 INTEGER_REF_32 中,“as_integer_64”被定义为“Result := item.as_integer_64”,其中“item”是展开后的 INTEGER_32!换句话说,孩子调用其父母的特征,父母调用孩子的特征。我也很困惑为什么扩展版本用看似等效的定义来明确重新定义“as_integer_64”。
我希望看到原始类型的实现细节终止,并表明某些特性是内部定义的。相反,我发现了这些循环定义。显然,编译器对原始类型的了解比源文本文件中出现的更多。当编译器看到它知道的原始类型时,编译器是否会忽略源文本,或者 Precurser 在这种情况下具有不同的含义?重新定义是对编译器的某种暗示,还是让解析器满意的东西?