GS

被sgao忘记的东西都在这里。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TObject、Pointer、Interface的转换

Posted on   sgao  阅读(850)  评论(0编辑  收藏  举报
复制代码
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  //测试接口
  ITest = interface
    function GetName: string;
  end;

  //接口实现类
  TTest = class(TInterfacedObject, ITest)
  public
    function GetName: string;
  end;

  //测试窗体
  TForm4 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

{ TTest }

function TTest.GetName: string;
begin
  Result := 'igaoshang.cnblogs.com'
end;

//点击测试按钮
procedure TForm4.btn1Click(Sender: TObject);
var
  LTestObj: TTest;
  LTestInf: ITest;
  LObj1, LObj2: TObject;
  LInf1, LInf2: ITest;
begin
  //创建接口对象
  LTestObj := TTest.Create;
  mmo1.Lines.Add('LTestObj地址:' + IntToHex(Integer(Pointer(LTestObj)),0));
  //给接口赋值
  LTestInf := LTestObj;
  //将接口转为Obj
  LObj1 := TObject(LTestInf);     //将接口对象地址赋值给了LObj1,但丢失了接口信息
  mmo1.Lines.Add('LObj1地址:' + IntToHex(Integer(Pointer(LObj1)),0));   //LTestObj地址 = LObj1地址
  LObj2 := TObject(Pointer(LTestInf));  //保留了接口信息,但生成了新的指针
  mmo1.Lines.Add('LObj2地址:' + IntToHex(Integer(Pointer(LObj2)),0));
  //将Obj转为接口
  
//LInf1 := ITest(Pointer(LObj1));       //无法转换了,丢失了接口信息
  
//mmo1.Lines.Add(LInf1.GetName);
  LInf1 := ITest(TTest(LObj1));           //可以这样转换
  mmo1.Lines.Add(LInf1.GetName);
  LInf2 := ITest(Pointer(LObj2));         //可以将对象直接转换成接口
  mmo1.Lines.Add(LInf2.GetName);
end;

end.
复制代码
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示