Delp hi 接口的底层实现 引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的;对于服务端的类来说,如果它想实现某种服务,实现与该服务相关的接口即可,它也不必与使用服务的客户端进行过多的交互
这种良好的设计方式已经受到很广泛的应用
早在 Delphi 3 的时候就引入了接口的概念,当时完全是因为COM 的出现而诞生的,但经过这么多版本的进化,Delphi 的接口已经成为Object Pascal语言的一部分,我们完全可以用接口来完成我们的设计,而不用考虑与COM 相关的东西
那么接口在 Delphi 中是如何实现的呢,很多人想得很复杂,其实它的本质不过也是一些简单的数据结构和调用规则
笔者假设读者已经有接口的使用经验,本文试图向你展示接口在 Delphi 中的实现过程,使你在使用接口的时候,知其然而知其所以然
接口在内存中的分布 接口在概念上并不是一个实体,它需要与实现接口的类关联,如果脱离了这些类,接口就变得没有意义了
但接口在内存中仍然有其布局,它依附在对象的内存空间中
Delphi 对象本质上是一个指向特定内存空间的指针,这块内存的前四个字节是一个指针指向类的VMT 表,接下来排布对象的数据成员,如果对象实现了接口,则在后面又排着一系列指针,我们可以认为这些指针就是对应的接口,每个指针就指向一个接口方法表
我们来看一下简单的例子: type ITest1 = interface ['{5347BB0D-89B7-4674-A991-5C527BE6F8A8}'] procedure SayHello1; end; ITest2 = interface ['{567B86BB-711D-40C2-8E5E-364B742C2FF1}�