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.
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.
分类:
002.Delphi
, 004.记录
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具