【发布时间】:2018-07-08 05:33:29
【问题描述】:
我目前正在研究我的编程语言,它只有接口,没有对象继承。我有一个问题,因为我不知道如何制作一个 vtable,因此可以在继承了许多接口的类中调用适当的方法。
在Java中,你可以这样写
interface A {
void a();
}
interface B {
void b();
}
interface C {
void c();
}
class Something1 implements A, B{
... implementing a() and b() ...
}
class Something2 implements B, C{
... implementing b() and c() ...
}
...
B obj = new Something1();
obj.b();
obj = new Something2();
obj.b();
并且JVM会调用b()方法,只知道对象继承了B接口(如果没有优化)
所以我认为,首先JVM会去对象的vtable,然后......它如何在vtable中找到b()以及必须生成什么样的vtable。
P.S 这个问题根本与 Java 无关。它可以是 C++ 或 PHP 的示例,没关系。用Java写一个例子更简单
【问题讨论】:
-
因为这是你自己的语言,你可能做类似
<Z extends A & B> Z obj = new Something1();你的Something2分配给obj更麻烦,因为它意味着类型的变化. -
语言非常重要,因为这里的静态编译语言和动态编译语言之间存在巨大差异。
-
除此之外:您必须了解分配左侧源代码中使用的“左手类型”在运行时并不重要。在运行时,当一个对象被实例化时,它的确切类是已知的。包括对属于该类的所有方法的全面了解。在运行时,所有这些事实都是已知的,并且不会针对特定对象而改变!
-
还请注意,仅使用搜索引擎就可以在此处和其他地方为您提供各种其他问题并提供很好的答案。进行这项研究是此类练习的重要组成部分。您应该避免问“向我解释”,而是找到自己的方法,然后与您的同行交流以获得反馈。
-
我的语言将被静态类型化和编译,并使用非常广泛的类型推断。分配只是将对象转换为接口然后找出某个方法在哪里的确切情况的一个示例。如果时间不够的话,我可以寻找一些更好的解决方案,并对一些更好的方法进行更多的研究,因为这种语言应该在 10 或 9 天内完成。我不是要“解释”。我只是要求一些参考或方法,以便我可以做一些研究并自己制作。