每种标识符的正确术语是什么?

7

请看以下代码:

IFoo foo = new FooImplementation();

标识符foo有两种类型:

  1. IFoo - 这是编译器将执行的类型。我只能调用IFoo合同中的方法,否则我将得到编译器错误。
  2. FooImplementation - 这是运行时所知道的类型。我可以在运行时将foo向下转换为FooImplementation,然后调用FooImplementation的非IFoo方法。

我的问题:这两种类型的正确术语是什么?我可以发誓在学校里我们被教导IFoo是标识符的静态类型,而FooImplementation是其动态类型,但在Google上搜索了很多后,我似乎找不到任何相关的参考资料。


IFoo 是变量 foo 的类型。FooImplementation 是分配给 foo 的内存类型。 - D J
不确定为什么我被踩了。我认为这个问题完全合理。 - Mike Christensen
3个回答

7

我将称呼IFooFooImplementation分别为编译时类型和运行时类型。例如,C#规范在讨论虚方法(第1.6.6.4节)时使用了这种语言:

当调用虚方法时,该调用所针对的实例的运行时类型决定要调用哪个实际方法实现。在非虚拟方法调用中,实例的编译时类型是决定因素。


+1 语言规范参考。 - Mike Christensen

5
我同意 Mike Z 的观点。在 C# 中通常使用的术语是“编译时类型”和“运行时类型”。
“静态类型”和“动态类型”是完全合理的术语,但我建议不要在 C# 的上下文中使用它们。“静态类型”可能会被错误地与“静态类”混淆,后者只能包含静态方法。“动态类型”也可能会被错误地与添加到 C# 4 中的动态类型功能混淆。

我越想越觉得,我读过一本书,其中提到了“静态”和“动态”类型的术语,那可能是90年代的一本C++书籍。也许那只是作者的偏好。在C++世界中这很有道理,因为C++是最不动态的东西。 - Mike Christensen
@MikeChristensen:虚方法使C++变得非常动态。在编译时,您根本不知道将调用哪种方法。该方法将根据接收器的运行时类型“动态”选择。 - Eric Lippert
我的 C++ 有点生疏,但编译器不是会构建一个包含虚方法所有实现指针的 vtable 吗?所以,你仍然受限于某种编译时类型。相对于 JavaScript,你可以随时编写一个对象字面量。 - Mike Christensen
@MikeChristensen: 当然,JavaScript更加动态。但C++远非最不动态的语言。 - Eric Lippert
我们可能在谈论两件不同的事情。我使用“动态”这个词与“动态编程语言”的上下文相同。当我想到动态语言时,我想到的是一种可以在运行时修改类型系统的类型系统。当然,C++允许多态性,但类型的确切行为是恒定的。也就是说,编译器在您的虚函数调用中添加了一些指针算术。我所说的“有史以来最不动态的东西”(如果您能忽略夸张之词)是指C++离我认为的“动态编程语言”相当远。 - Mike Christensen

4
第一个是声明类型,第二个是具体类型。 ......至少我是这样称呼它们的。

好像我的老师(这是在90年代)也是凭空发明了自己的术语。现在,他的术语可能会导致混淆,因为动态类型语言越来越流行。 - Mike Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接