• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi-必须的一致.

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

大家好,我是HuangJacky,技术交流.
这个是在工作发现的一个问题,而且是很久的问题了.当时已经写成文章了.但是(往往时常都有这个但是)系统挂了,文章还没有发出来.
好,赶紧发出来.

首先还原下问题:(这个 插件居然没有Pascal)

1: //首先定义具有继承关系的接口
interface
   3:     procedure TalkBase;
end;
   5:  
interface(IBase)
   7:     procedure TalkDerive;
end;
   9:   //实现的类
class(TInterfacedObject, IBase)
  11:     procedure TalkBase;
end;
  13:  
class(TBase, IDerive)
private
Integer;
public
  18:     constructor Create();
  19:     procedure TalkBase;
  20:     procedure TalkDerive;
end;

类得实现.

   1: { TDerive }
   2:  
   3: constructor TDerive.Create;
   4: begin
   5:   FTest:= 55;
end;
   7:  
   8: procedure TDerive.TalkBase;
   9: begin
'Derive say base');
end;
  12:  
  13: procedure TDerive.TalkDerive;
  14: begin
'Derive');
end;
  17:  
  18: { TBase }
  19:  
  20: procedure TBase.TalkBase;
  21: begin
'Base');
end;

现在我们有一个列表,列表里面可以装这些接口的:

Add(Obj: IBase);
begin
Add(Pointer(Obj))
end;

是吧,这样列表里面都是放的接口.我们来看看使用的代码:

procedure TForm2.btnTestClick(Sender: TObject);
begin
//加两个
Create;
Add(A);
Create;
Add(A);
//使用
   9:   A:= TDerive(FList[0]);
//我们预期是55
end;

可是结果是怎么样的呢?

为什么是这么多呢?
后来我发现我们加进去的是接口IBase而我们使用的时候是直接转化TDerive.中间少了一步转换pointer->IBase.好的代码改一下:

//使用
   2:   A:= TDerive(IBase(FList[0]));
   3:   ShowMessage(IntToStr(A.FTest));//我们预期是55

结果: .正确了.
这里说明了什么?TList里面我们加进去的是什么,使用的时候就要先转换成加进去时候的类型后才能再转换成其他类型.
原因呢?
这个是因为Delphi中对象的内存组织决定的.
这个我明天说.现在得睡觉了


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLAB中常见的程序出错问题整理发布时间:2022-07-18
下一篇:
matlab中的卷积——filter,conv之间的区别发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap