,Delphi   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,Delphi
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > Delphi > 正文
基于Delphi的接口编程入门
[文章信息]
作者:IceAir
时间:2005-04-13
出处:blog
责任编辑:方舟
[文章导读]
举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票
advertisement
热点推荐
· VB实现SQL Server 2000存储过程调用
· Java解析网络数据流的三种特殊方法
· 多媒体教程:网页表单文本域类型
· 体验V5E地形编辑:整体控制
· 打造完美可随意安装的WinXP镜像
[正文]

1 2  下一页

  为什么使用接口?

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

  如何在Delphi中使用接口

  1、声明接口

IMyInterface = interface(IInterface) //说明(1)
['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}'] //说明(2)
function GetName(const str: String): String; stdcall;

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; //说明(3)
function _AddRef: Integer; stdcall; //使接口引用数加1。
function _Release: Integer; stdcall;//使接口引用数减1,当小于等于0时作释放动作。
end;

  说明(1):如果有继续关系则在括号里填父接口,否则省却,如:IMyInterface = interface这样就行。

  说明(2):此GUID可选,如果要实现具有COM特性的接口的话则需要加上,Delphi中对于有GUID的接口在运行时在VMT表的预定位置生成接口的信息,如接口方法的定义、方法参数定义能详细信息。

  说明(3):接口必须实现这三个函数。

  2、接口的实现

  接口服务是由类来实现的。

TIntfClass = class(TObject, IMyInterface)
private
 FCounter: Integer;
 FRefCount: Integer;
public
 function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
 ...
end;

  3、获取接口

  a. 使用类型转换。 如:

var aIntf: IMyInterface;
begin
 aObj := TIntfClass.Create;
try
 aIntf := (IMyInterface(aObj);
 ...

  b. 利用Delphi编译器内建机制。 如:aIntf := aObj。

  c. 利用对象的QueryInterface方法。如OleCheck(aObj.QueryInterface(IID, aIntf)); 只能存取有GUID的COM接口。

  d. 利用as操作符。

  使用as操作符必须符合下面条件:

  1.接口必须明确地指定是从IInterface接口继承下来。

  2.必须拥有GUID值

  在Delphi7中接口的实现类还必须是从TInterfacedObject继承下来才行,如:

TIntfClass = class(TInterfacedObject, IMyInterface)

  4、接口和对象生命期

  因为Delphi会自行检查接口如果在使用后没有释放而在生成的程序里加上释放代码,但也因这样带来了问题,如下面代码:

var
 i: Integer;
 aObj: TIntfClass;
 aIntf: IMyInterface;
begin
 aObj := TIntfclass.Create;
 try
  aIntf := aObj;
  aIntf.GetName...
 finally
  aIntf := nil;
  FreeAndNil(aObj);
end;

  上面的代码执行的话会产生存取违规错误,是因为对接口置nil时已释放接口,而FreeAndNil(aObj)会再释放aIntf一次,而在对aIntf置
nil时已释放了该对象。解决这个问题只要不让接口干扰对象的生命期就可以了,在Release中只需减引用计数而不做释放的动作。

function TIntfClass._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
end;


1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
,Delphi相关内容,Delphi焦点新闻
  • 利用Delphi开发旅游景点微机售票系统
  • TXMLDocument类:Delphi7的XML利器
  • 基于Delphi的Socket I/O模型全接触
  • 用Delphi实现QQ窗体的缩入伸出功能
  • Delphi中用ICMP探测远程主机状态
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,DelphiAdvertisement

    天极无线
    经典名曲 华语流行 欧美风情 人声音效 原声大碟
    你好周杰伦-安又琪
    直线-张韶涵
    天边-张韶涵
    看我72变-蔡依林
    乱世佳人-Twins
    全世界下雨-张娜拉
    我们的爱-飞儿乐队
    分手快乐-梁静茹
    爱在西元前-周杰伦
    三万英尺-迪克牛仔
    爱如潮水-张信哲
    爱情宣言-齐秦
    寻找玛依拉-刀郎
    驼铃-刀郎
    老鼠爱大米-杨臣刚
    功夫主题曲
    仙剑主题曲杀破狼
    天下无贼片尾曲
    冲动的惩罚-刀郎
    情人-刀郎
    爱情-莫文蔚
    挪威的森林-伍佰
    奔跑 - 羽泉
    因为爱 - 羽泉
      ·时尚女人圈
    ·经典影视专集
    ·美女秀场
    ·美丽大自然专题
    ·流行金曲
    ·科幻电影特区
    | 最新推荐
    ·你好周杰伦
    ·杀破狼
    ·寻找玛依拉
    ·孤单公园
    ·男人海洋
    | 魔术铃声
    ·少女丰胸
    ·少妇丰胸
    ·减肥魔铃
    ·增高魔铃
    ·美容魔铃

    今日报价查询 更多报价