Delphi 中的对象接口:Object Interfaces

         

目录

一、接口类型(Interface Types)

二、接口和继承(IInterface and Inheritance)

三、接口标识和 GUID(Interface Identification and GUIDs)

四、接口调用约定(Calling Conventions for Interfaces)

五、接口属性(Interface Properties)

六、前向声明(Forward Declarations)


        对象接口或简称接口,定义了类可以实现的方法。接口被声明为类,但不能直接实例化,也没有自己的方法定义。相反,任何支持接口的类都有责任提供接口方法的实现。接口类型的变量可以引用实现该接口的类的对象;但是,只有接口中声明的方法才能被调用。

        接口具有多重继承的一些优点,但没有语义上的困难。对于使用分布式对象模型(如 SOAP)来说,接口也是必不可少的。使用分布式对象模型,支持接口的自定义对象可以与 C++、Java 和其他语言编写的对象进行交互。

一、接口类型(Interface Types)

接口与类一样,只能在程序或单元的最外层范围内声明,而不能在存储过程或函数声明中声明。接口类型声明的形式如下 :

type interfaceName = interface (ancestorInterface) ['{GUID}'] memberList end;

警告: 为了支持 Win32 COM 的互操作性,需要使用 ancestorInterface GUID 规范。如果要通过 COM 访问接口,请务必指定 ancestorInterface GUID

在大多数方面,接口声明与类声明相似,但有以下限制: 

  1. 成员列表只能包括方法和属性。接口中不允许有字段。
  2. 由于接口没有字段,因此属性的读写指定必须是方法。
  3. 接口的所有成员都是公用的。不允许使用可见性指定符和存储指定符。(但数组属性可以声明为默认)。
  4. 接口没有构造函数或析构函数。除了通过实现其方法的类外,它们不能被实例化。
  5. 方法不能声明为虚拟、动态、抽象或覆盖(virtual, dynamic, abstract, or override)。由于接口不实现自己的方法,因此这些名称没有任何意义。

下面是一个接口声明的示例: 

type IMalloc = interface(IInterface)
    ['{00000002-0000-0000-C000-000000000046}'] 
    function Alloc(Size: Integer): Pointer; stdcall; 
    function Realloc(P: Pointer; Size: Integer): Pointer; stdcall; 
    procedure Free(P: Pointer); stdcall;
    function GetSize(P: Pointer): Integer; stdcall;
    function DidAlloc(P: Pointer): Integer; stdcall;
    procedure HeapMinimize; stdcall;
  end;

在某些接口声明中,interface 保留字由 dispinterface 代替。

二、接口和继承(IInterface and Inheritance)

        接口与类一样,继承其祖先的所有方法。但接口与类不同,并不实现方法。接口继承的是实现方法的义务,这种义务会传递给任何支持接口的类。

        接口的声明可以指定一个祖先接口。如果没有指定祖先接口,该接口就是 IInterface 的直接后代,而 IInterface 是在 System 单元中定义的,是所有其他接口的最终祖先。在 Win32 中,IInterface 声明了三个方法: QueryInterface、_AddRef 和 _Release。

注意:IInterface 等同于 IUnknown。一般来说,独立于平台的应用程序应使用 IInterface,而包含 Win32 依赖性的特定程序则应保留使用 IUnknown。

        QueryInterface 提供了获取对象所支持的不同接口引用的方法。_AddRef 和 _Release 为接口引用提供了生命周期内存管理。实现这些方法的最简单方法是从 System 单元的 TInterfacedObject 派生实现类。也可以通过以空函数的形式实现这些方法中的任何一种,但 COM 对象必须通过 _AddRef 和 _Release 进行管理。

警告: 需要使用 QueryInterface、_AddRef 和 _Release 来支持 Win32 COM 互操作性。如果要通过 COM 访问接口,请务必实现这些方法。

三、接口标识和 GUID(Interface Identification and GUIDs)

接口声明可以指定一个全局唯一标识符(GUID),该标识符由一个字面字符串表示,该字符串括在成员列表前的括号中。声明中的 GUID 部分必须具有以下形式 :

 ['{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}']

        其中每个 x 是十六进制数字(0 到 9 或 A 到 F)。类型库编辑器会自动为新界面生成 GUID。您也可以在代码编辑器中按 Ctrl+Shift+G 生成 GUID。

        GUID 是唯一标识接口的 16 字节二进制值。如果接口有 GUID,就可以使用接口查询来获取其实现的引用。

注:GUID 仅用于 COM 的互操作性。

        系统单元中声明的 TGUID 和 PGUID 类型用于操作 GUID。

type 
     PGUID = ^TGUID;
     TGUID = packed record
       D1: Cardinal;
       D2: Word;
       D3: Word;
       D4: array[0..7] of Byte;
   end;

支持有两种调用方式:

if Supports(Allocator, IMalloc) then ...

或者

if Supports(Allocator, IID_IMalloc) then ...

注:SysUtils 单元提供了一个名为 Supports 的重载函数,当类类型和实例支持由 GUID 表示的特定接口时,该函数返回 true 或 false。Supports 函数的使用方式与 Delphi is 和 as 操作符相同。不同之处在于,Supports 函数的右操作数可以是 GUID 或与 GUID 相关联的接口类型,而 is 和 as 操作数的右操作数则是类型名称。有关 is 和 as 的更多信息,请参阅类引用。

四、接口调用约定(Calling Conventions for Interfaces)

        接口方法的默认调用约定是 register,但模块间共享的接口(尤其是用不同语言编写的接口)应使用 stdcall 声明所有方法。在 Win32 中,可以使用 safecall 来实现双接口的方法。

五、接口属性(Interface Properties)

        接口中声明的属性只能通过接口类型的表达式访问,不能通过类类型变量访问。此外,接口属性只能在编译了接口的程序中可见。

        在接口中,属性的读取和写入指定必须是方法,因为字段是不可用的。

六、前向声明(Forward Declarations)

        以保留字 interface 和分号结尾的接口声明,如果没有指定祖先、GUID 或成员列表,则属于正向声明。前向声明必须由同一类型声明部分中同一接口的定义声明来解决。换句话说,在前向声明和定义声明之间,除了其他类型声明外,不能有任何其他声明。

        前向声明允许相互依赖的接口。例如 :

type 
   IControl = interface; 
   IWindow = interface 
       ['{00000115-0000-0000-C000-000000000044}'] 
       function GetControl(Index: Integer): IControl; 
         //. . . 
     end; 
   IControl = interface 
       ['{00000115-0000-0000-C000-000000000049}'] 
       function GetWindow: IWindow; 
       //. . . 
     end;

        不允许相互派生接口。例如,从 IControl 派生 IWindow 和从 IWindow 派生 IControl 都是不合法的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 是的,Delphi可以调用Java接口Delphi是一种编程语言和集成开发环境,主要用于Windows平台的应用程序开发。Java是一种面向对象的编程语言,广泛用于开发跨平台的企业级应用程序。 Java接口是一种定义了一组方法的抽象类型,用于实现类之间的约定。通过接口,我们可以实现类的多态性和代码的复用。 在Delphi,我们可以使用JNI(Java Native Interface)来调用Java接口。JNI允许我们在Delphi应用程序使用Java类和接口,通过这种方式,我们可以与Java平台进行交互。 要调用Java接口,我们首先需要将Java代码编译为Java类文件,并使用Java编译器生成带有C风格函数原型的动态链接库(DLL)。 然后,在Delphi,我们使用LoadLibrary函数加载DLL,并使用GetProcAddress函数获取Java接口的函数的地址。 接下来,我们可以使用JVM创建Java虚拟机,并通过调用接口方法来实现与Java交互。需要注意的是,我们需要将接口方法的参数和返回值类型转换为Delphi相应的类型。 在调用Java接口时,我们可以传递参数,并获取方法的返回值。通过这种方式,我们可以利用Delphi的强大功能和Java的跨平台优势进行开发。 总结而言,Delphi可以调用Java接口,通过JNI实现与Java的交互。这种跨平台的互操作性为开发者提供了更加灵活和强大的开发选择。 ### 回答2: Delphi是一种基于Object Pascal语言的集成开发环境(IDE),主要用于Windows平台上的应用程序开发。它提供了广泛的库和工具,可以快速开发各种类型的应用程序。 虽然Delphi和Java是两种不同的编程语言,但Delphi可以通过使用Java Native Interface(JNI)来调用Java接口。JNI是一种允许不同编程语言互相调用的机制,它提供了Java和其他编程语言之间的桥梁。 在Delphi调用Java接口可以通过以下几个步骤完成: 1. 编写Java接口:首先,在Java编写一个接口,定义要在Delphi调用的方法和参数。 2. 使用Java编译器:将编写的Java接口编译成字节码文件(.class文件)。 3. 使用Delphi的JNI支持:在Delphi的代码,使用JNI支持库(如Jvcl或JVCL)来加载Java的字节码文件,并将其转换为Delphi可以调用的方式。 4. 调用Java接口方法:一旦Java接口被加载,就可以在Delphi使用其方法来调用Java代码。 通过这种方式,Delphi可以与Java进行交互,调用Java接口定义的方法,并传递参数。这对于需要在Delphi应用程序使用Java库或与其他Java应用程序进行通信的开发人员来说非常有用。 总结起来,Delphi可以通过JNI机制来调用Java接口,从而实现与Java的交互和通信。这为开发人员提供了更广泛的工具和库选择,加快了应用程序的开发速度和灵活性。 ### 回答3: 是的,Delphi可以通过使用Java Native Interface (JNI) 来调用Java接口。JNI 是Java平台提供的一种机制,它允许Java代码和非Java代码(如C++或Delphi)进行交互。 要在Delphi调用Java接口,需要进行以下步骤: 1. 创建一个Java类,并在其定义接口方法。 2. 使用Java编译器将该类编译为一个.jar文件。 3. 在Delphi导入Java类库,可以使用Java Importer工具或JNI API进行导入。 4. 建立连接和协议,使Delphi能够调用Java方法。可以使用JNI API提供的函数来创建并连接到Java虚拟机(JVM)。 5. 在Delphi编写代码,调用Java接口方法。 6. 运行Delphi应用程序,即可实现调用Java接口。 通过这种方式,Delphi程序可以利用Java所提供的各种功能和接口,而无需重新编写Java代码。这样可以提高开发效率和软件的复用性。 注意,为了确保调用的正确性和可靠性,必须仔细处理数据类型转换和参数传递等问题。 总之,Delphi通过JNI可以调用Java接口,并且可以从Java程序获得所需的功能和特性。这使得Delphi开发人员能够利用Java丰富的生态系统,扩展和增强他们的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值