delphi的interface编程注意问题
来源:互联网 发布:腾讯云域名dns未生效 编辑:程序博客网 时间:2024/05/01 07:20
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编程注意问题
- 编程注意的问题
- 编程注意的问题
- Delphi写DLL要注意的问题
- Delphi多线程注意问题
- 一些编程注意的问题
- 编程要注意的问题
- Delphi Interface接口的定义
- delphi调用vc编写的DLL应注意的问题
- Delphi中使用TXMLDocument控件应注意的问题
- Java的编程应该注意的问题
- Delphi 编程中遇到的怪问题
- delphi编程的问题!急急急
- Delphi中的多线程编程问题的说明
- JAVA编程中应该注意的问题
- 编程中注意的一个问题
- websphere数据库编程必须注意的问题
- 并行编程中应注意的问题
- SQL注入分析
- 一些经典但绝对惊人的东西zz
- 软件开发的新的模式
- 开始我的Blog
- 拍马屁能拍到如此的境界
- delphi的interface编程注意问题
- Automatic Transactions and .NET Framework Classes
- (JAVA)Regular Expression测试
- Delphi自带的SpinEdit控件太丑了,自己写一个替换它
- 将asp权限提到最高
- 利用C++Builder 6 中OLE自动化功能实现调用Word进行报表制作
- SAML简介(beegee译稿)
- 上午跑去单位将佛山公文交换联调了一下,下午继续闭关修炼(CA)
- IT人的通病,你占了几条?〔转自pconline〕