在较高的层面上,我理解界面是一种说法
这样做,我不在乎
换句话说,它基本上允许您以声明方式而不是命令式进行编程。如果部分代码可以告诉其他部分该做什么,而不是如何做,那么您可以使代码更加灵活。
当谈到像Java这样的高级语言时,我理解了这个概念。
但是,我很好奇编译器如何处理接口。这可能是一个比我意识到的更大的问题。
这是我的理论:它基于RAM中的偏移量。
例如,当创建一个实现包含ICompare
方法的Compare
接口的对象时,编译器知道将Compare
方法置于16字节偏移量该对象在RAM中的起始位置。实际上,实现ICompare
方法的每个对象在第16个字节都有Compare
方法。这样,当其他代码使用该接口调用Compare
方法时,系统知道在该对象的第16个字节处执行指令。
编译器是如何处理接口的(使用每个对象中的标准位置)还是使用某种查找表来了解对象的Compare
方法的位置?还是其他一些方法?
答案 0 :(得分:0)
对于对此问题感兴趣的任何人,here是一个优秀的视频,可视化解释vtable如何在C ++中实际实现。对象的前四个字节可以指向vtable,该vtable指向用于该特定类的正确方法。
感谢@sircodesalot提示。