delphi的interface编程注意问题

原创 2004年10月28日 15:01:00

1.不支持继承
2.不能从接口获得实现类,如:
ITest = interface
...
end;

TTest = class(TObject, ITest)
...
end;

...
var
  tmpITest: ITest;
  tmpTTest: TTest;
  tmpTTest2: TTest;
...
  tmpITest := tmpTTest;//正确
...
  TTest(tmpITest).xxx();//不正确,运行期非法地址访问错误。
  tmpTTest2 := tmpITest;
   tmpTTest2.xxx();不正确,运行期非法地址访问错误。



3.接口设置为nil的情况
tmpI: ITest;
...
tmpI := nil;
//这个时候,delphi会调用function _IntfClear(var Dest: IInterface): Pointer;
//该函数内部调用了_Release
//所以delphi编程的com对象释放就是设置为nil就好(directX,com,com+等)
如果不想delphi默认调用函数_IntfClear可以怎么做
Pointer(tmpI) := nil;
强制转化为指针操作



4.对于类引用了接口的情况,delphi是先释放自己,在释放引用的接口的实现对象.
ITest = interface
...
end;

TTest = class(TObject, ITest)
...
  second: ITest;
  procedure SetSecondITest(aITest: ITest);
end;

procedure TTest.SetSecondITest(aITest: ITest);
begin
  second := aITest;
end;

procedure Test();
var
t1, t2: TTest;
i1, i1: ITest;
begin
t1 := TTest.Create();
i1 := t1;
t2 := TTest.Create();
i2 := t2;
t1.SetSecondITest(i2);
t2.SetSecondITest(i1);
end;
结果是delphi异常错误
t1释放的时候,先自己释放后,接着把i2的对象t2释放掉了,所以t2的释放就不对了。
注释掉"t1.SetSecondITest(i2);"会发现t2先释放,然后t1释放
注释掉"t2.SetSecondITest(ii);"会发现t1先释放,然后t2释放
(可以通过在destructor函数打印消息获得谁在释放)


5.
  结合3和4会发现,如果做一个接口的实现类的接口列表会有隐藏问题
  操作列表的时候,如果释放了列表保存的指针(:=nil)/释放列表的时候会释放对应的对象
  这个是不允许的!!!释放列表的时候最好做Pointer(tmpI) := nil;这样的操作
  才不容易引起一些莫名其妙的异常错误

delphi interface 总结

1、 interface 是申明了一些函数,自己本身没有定义部分,需要由继承它的类来实现函数。 2、interface 可以被不同的类继承,并且函数的实现方法各不相同。 3、继承interface 的...
  • hust_bochu_xuchao
  • hust_bochu_xuchao
  • 2017年02月24日 16:07
  • 1401

编程中的一些注意事项

               1、refactoring的基本方法就是每一步小小变化,每一步测试。        2、如果发现需要为一个程序添加一个特性,而代码结构使你无法很方便的那么做,那就先重构那...
  • casularm
  • casularm
  • 2004年10月27日 21:06
  • 2826

UDP编程特点注意事项

 1。udp编程特点:1)udp发送和接收没有缓冲区,发送和接收都是整包,自动保持包的边界2)udp包的发送和接收不保证一定成功,不保证按正确顺序抵达2。注意事项1)在接收udp包时,如果接收包时给定...
  • xuhx
  • xuhx
  • 2008年04月16日 15:19
  • 1469

Delphi中Interface接口的使用方法

  unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms...
  • delphi1234
  • delphi1234
  • 2008年02月20日 18:41
  • 9076

C#编程的一般注意事项

C# 命名原则
  • dingxy
  • dingxy
  • 2011年05月29日 11:07
  • 1119

jni开发需要注意的问题:

jni开发需要注意的问题: 背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台。这就涉及到Android NDK(native develop ki...
  • tianyeming
  • tianyeming
  • 2016年11月25日 17:54
  • 553

Delphi COM编程介绍

软件重用是业界追求的目标,人们一直希望能够像搭积木一样随意“装配”应用程序,组件对象就充当了积木的角色。所谓组件对象,实际上就是预定义好的、能完成一定功能的服务或接口。问题是,这些组件对象如何与应用程...
  • zang141588761
  • zang141588761
  • 2016年05月13日 14:56
  • 968

使用百度地图需要注意的问题

在使用百度地图的时候,首先按自己的需求下载相关的SDK ,把.framework相关的文件拖入工程中 1,配置开发环境 由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK...
  • CloverZhu
  • CloverZhu
  • 2015年12月20日 20:11
  • 984

国际化编程的注意点

国际化编程的注意点 天气:    时间:2005-04-18 15:23:32 ...
  • wbryfl
  • wbryfl
  • 2006年12月19日 18:54
  • 1846

编码要注意的问题

不管你用什么语言进行开发,所有的优秀代码都会展示出共有的经典品质:简练,易于理解,模块化,层次性,设计良好,高效,优雅,并且清晰。简练。这意味着能用五行代码解决的问题,绝不用十行代码。这也意味着,必须...
  • cloudday
  • cloudday
  • 2008年07月03日 15:10
  • 424
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delphi的interface编程注意问题
举报原因:
原因补充:

(最多只允许输入30个字)