Delphi的接口(1)

之前, 有朋友夸过我: 博文通俗易懂, 能把复杂的问题简单化;

希望我对接口的理解也能对大家有所帮助; 不过其中个人理解的成分多些, 错 误之处万望指出.

"接口" 的概念和 "类" 特别是 "抽象类" 近似, Delphi 之初并没有接口, 后来(Delphi 3)为了支持 COM 引入了接口, 再 后来发展成为 Delphi 重要的语言特性.

应该先简单了解点 COM, 说到 COM, 能让我想到 "有心栽花花不活, 无 意插柳柳成荫" 的古话.

微软在开发 OLE 时, 有一种需求: 使用其他程序中的对象, 这种需求导致了 COM 的诞生并发扬光大, 而 OLE 却在慢慢地销声匿迹.

从 COM 到 COM+, 之后好像微软并没有再大力发展(可能是把精力都放到 Net 上去了, 但 Net 也没离开 COM), 它现在仍有着非常广泛的应用, 这应该得益于 它先进的思想.

慢慢道来:

1、一个二进制的 1 或 0, 这是任何语言都可以识别的;

2、一个字符, 也是任何语言都可以识别的;

3、一个整形变量, 也是任何语言都可以识别的;

4、一个结构体, 也是任何语言都可以识别的;

5、一个函数也没有问题, 譬如 Delphi 调用 API;

6、但一个 "对象" 或着 "类" 呢? 这在跨程序、跨语 言时就不好识别了.

COM 解决了这个问题! 并进而应用于网络.

COM 规定了一个二进制的标准, 这个标准主要针对 "对象方法的声明 "(也就是接口), 同时把声明(接口)和实现分开.

不同的语言都可以来实现这个接口、同时不同的语言(在遵循标准的情况下)也 都能识别这个接口, 从而实现的跨语言的对象的交互.

现在看看这个过程其实是水到渠成、挺自然的; 但好像当初微软的 COM 之路 也并不平坦.

微软通过 COM 组件的方式提供了很多功能, 它们很可能是用 C++ 实现的, 我 们用 Delphi 可以很好的使用, 本质上说就是 Delphi 遵循了那个二进制的标准; 相反, Delphi 按这个标准声明、并用自己的语言实现的 COM 组件也能供其他语 言使用.

一个 COM 组件里有什么呢?

主要是一堆接口(也就是声明)和接口的实现, 每个接口对应一个计数器, 另包 含一个叫 "类厂" 的东西.

使用 COM 步骤可能是这样的:

1、程序在使用组件之初, 先联系 "接口"; 这应该是从注册表中查 询.

2、找到后, 如果此接口还没有被实现, 马上调用 "类厂" 建立起 对象, 并同时给接口计数器加 1.

3、可能会不止一个程序在使用同一个接口, 但每有使用则 "计数器 +1", 每次用完则 "计数器-1".

4、当接口的使用计数为 0 时, 系统自动释放类厂为该接口建立的对象(垃圾 回收机制).

我们 Delphi 中的接口当然也是这样, 用完会自动释放, 无需手动 free.

接口在 Delphi 中继续支持着 COM 并继续完善着, 接下来要讨论的是作为语 言特性的 "接口" 概念与使用.

我曾经被 "接口" 置于云雾之中, 一些书也让人越看越糊涂; 明白 了以后发现其实挺简单的, 相比 "类" 的规则要简单许多.

时间: 2024-08-22 14:21:05

Delphi的接口(1)的相关文章

Delphi的接口(2)

第一个例子的操作实况录像: http://www.bianceng.net/delphi/201212/657.htm 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton;

基于Delphi的接口编程入门

为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以卖票,很显然不适合把经理人也包括到卖票服务的继承架构中,我们需要的只是一个共通的卖票服务.于是,卖票的服务是个接口,电影院.歌剧院什么的只要都遵循这样一个服务定义就能很好地相互交互和沟通(如果须要的话). 如何在Delphi中使用接口 1.声明接口 IMyInterface = interface(

Delphi的接口(4)

代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; {此接口声明了一个 Name 属性; 因为接口没有字段, rea

Delphi的接口(3)

代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(S

Delphi的接口(5)

代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; IMyInterface1 = interface functi

Delphi ListView快速操作通用实现之实现篇

众所周知,Delphi ListView类直接进行Add.Update.Delete操作的速度是比较慢的,尤其是当数据量较 大时,比如数据量达到5000.10000.50000时,速度真是可以说是"慢得惊人".其实快速操作的方法非常简 单,就当大家都知道了.在本人的工作中,很多项目都用到ListView,并且对速度的响应要求比较高,于是发 生了快速操作ListView的代码散布于多个项目大量模块中的问题,并且,当界面层数据显示要求发生改变时, 自然发生"重复性代码的通用问题&

018_《Delphi下深入Windows核心编程》

<Delphi下深入Windows核心编程> Delphi 教程 系列书籍 (018) <Delphi下深入Windows核心编程> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3     书名: Delphi下深入Windows核心编程 作者: 飞思科技产品研发中心 出版社: 电子工业出版社 书号: 7505384023 出版日期:2003年1月 开本: 787*1092 1/16 页码: 525 版次: 2003年1

.net Winform程序调用delphi编写的dll出错,求救!!

问题描述 winform调用delphi的dll,delphi里面的代码是连接远程服务器,发送过来数据,并在dll里处理接收.我在.net用委托调用delphi的接口方法,获取到了delphi传过来的实时数据,但是在获取到6分钟的时候就不获取了,连接都正常,也不报错,找不到原因,求高手解决!!Winform代码:.net声明调用dll:处理回来数据的方法,目前什么都不做:delphi接口代码:入口:触发事件调用的方法:处理数据方法:声明的委托:现在已经将delphi的代码封装成dll,但是.ne

C#调用Delphi写的dll的问题。

问题描述 有这样一个Delphi原型接口.声明如下TArrayOfByte=arrayofByte;functionGetTemplateFromFile(imgPath:PAnsiChar;varATemplate:TArrayOfByte):Integer;stdcall;ATemplate这个参数是一组Byte数组,但这数组的大小是在接口即GetTemplateFromFile函数里分配的.通常情况下返回4096个字节.但我引用C#调用时,发现只返回一个字节.C#声明方式如下.[DllIm