TObject、Pointer、Interface的转换
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)),));
//给接口赋值
LTestInf := LTestObj;
//将接口转为Obj
LObj1 := TObject(LTestInf); //将接口对象地址赋值给了LObj1,但丢失了接口信息
mmo1.Lines.Add('LObj1地址:' + IntToHex(Integer(Pointer(LObj1)),)); //LTestObj地址 = LObj1地址
LObj2 := TObject(Pointer(LTestInf)); //保留了接口信息,但生成了新的指针
mmo1.Lines.Add('LObj2地址:' + IntToHex(Integer(Pointer(LObj2)),));
//将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.
TObject、Pointer、Interface的转换的更多相关文章
- golang - interface的作用
多态.struct 可以赋值给 interface.interface 可以转换成子接口,或者 struct. 请看go中的一段的源代码: listener, _ := net.Listen(&quo ...
- 从零搭建Spring Cloud Gateway网关(三)——报文结构转换
背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...
- Delphi -- Compiler helper for initializing/finalizing variable
it CompilerhelperForInitializingFinalizingVariable; interface { Compiler helper for initializing/fin ...
- Go学习笔记01-语言
1.1 变量 Go 是静态类型语言,不能在运行期改变变量类型.使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器自动推断. var x int var f fl ...
- Go语言学习之6 反射详解
1.反射: 定义: 反射就是程序能够在运行时检查变量和值,求出它们的类型. 可以在运行时动态获取变量的相关信息 Import ( ...
- Golang的反射reflect深入理解和示例
编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...
- [golang]golang 汇编
https://lrita.github.io/2017/12/12/golang-asm/#why 在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于 ...
- golang(11) 反射用法详解
原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...
- Go反射
一.引入 不同语言的反射模型不尽相同,有些语言还不支持反射.<Go 语言圣经>中是这样定义反射的: Go 语言提供了一种机制在运行时更新变量和检查它们的值.调用它们的方法,但是在编译时并不 ...
随机推荐
- iOS应用性能调优好文mark
http://www.cocoachina.com/ios/20150408/11501.html
- Your build settings specify a provisioning profile with the UUID, no provisioning profile
在Archive项目时,出现了“Your build settings specify a provisioning profile with the UUID “”, however, no suc ...
- linux-命令-ls
一.命令介绍: ls命令是linux常用的命令之一.ls用来打印当前目录的文件清单或指定目录的文件清单,也可以查看到文件的基本权限和隐藏文件. 二.命令格式: ls [OPTION]... [FILE ...
- Android自定义权限和使用权限
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 自定义权限,主要用于保护被赋予权限的组件.如无权限与有权限,正如public与private的对类保 ...
- 解决Tomcat7“At least one JAR was scanned for TLDs yet contained no TLDs”问题
解决Tomcat7“At least one JAR was scanned for TLDs yet contained no TLDs”问题 2013-12-05 21:58:00| 分类: t ...
- ThinkPHP 自动验证相关注意
1.假如加入了表单令牌的话,表单的各种名与对应Model字段一致,不然报坑爹的令牌错误. 2.假如加入了表单令牌的话,Create只能采用默认的POST数据创建数据对象,不然又是坑爹的令牌错误. 3. ...
- c# DllImport 找不到指定模块
两年前的一个项目,基于身份证阅读器的开发,之前都是在公司电脑上开发维护等,今天有需要用到自己的笔记本,只有vs2008和mysql5.5,以为足够,兴致勃勃的拿到客户那里现场解决问题,F5运行程序,程 ...
- 个人Web工具箱&资源整理(1)
很久就想把使用的工具及收藏的资源整理一番:一是为了传达博客社区的理念:资源共享,而是方便自己及团队快速获取. 学习资源: 首推两个入门级在线参考网站. 1 w3c school. 2 Runoob.c ...
- PLS-00306错误
ORA-06550: line 1, column 7:PLS-00306: wrong number or types of arguments in call to 'P'ORA-06550: l ...
- haslayout
什么是 haslayout ? haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在Internet Explorer中,一个元素要么自己对自身的内容 ...