【问题标题】:How does Java (or C++) handles invocation of methods defined in interfaces [duplicate]Java(或C ++)如何处理接口中定义的方法的调用[重复]
【发布时间】: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 天内完成。我不是要“解释”。我只是要求一些参考或方法,以便我可以做一些研究并自己制作。

标签: java c++ vtable


【解决方案1】:

具有多重继承的 VTables 通常通过 vtable 调度程序实现。这意味着您为每个继承的接口创建一个 vtable,并根据使用的接口传递匹配的 vtable。

在您的情况下,您将为每个类创建两个 vtable。一种匹配B接口,一种匹配A或C接口。通过 B 接口传递你的类时。您将类数据指针 + 指针传递给 B 接口 vtable。

【讨论】:

  • 不,你不会。您将为该类提供一个复合 vtable,并在调用期间调整指针,以便访问 vtable 的正确部分,就像在子类化中一样。您不会为编译时已知的内容提供额外的运行时参数。
猜你喜欢
  • 2017-09-29
  • 2021-08-30
  • 2021-09-30
  • 1970-01-01
  • 2017-02-05
  • 2016-04-19
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多