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 语言提供了一种机制在运行时更新变量和检查它们的值.调用它们的方法,但是在编译时并不 ...
随机推荐
- Linux文件系统层次结构标准
该标准的目的是定义Linux文件系统的标准路径,使得开发者和用户可以在合理的位置找到需要的东西. Linux的文件布局的大体想法是将文件和目录分为如下3组: 对运行Linux的某一特定系统唯一的文件和 ...
- SqlServer 数据库 引擎优化使用(六)
一:新建模板 二:选择跟踪的语句类型: 使用模板: 把范文的行为进行记录: 开启引擎: 选择文件和数据库: 选择选项: 分析的结果:
- Azure Media Service
该视频来源于Build 2015, 视频比较老, 从演讲的角度看, 是个非常不错的演讲, 内容也很全面. Apr 27, 2015
- 字符串反转C#的实现
字符串反转是面试过程中出现频率较高的算法题,今天一个牛同事让我用C#帮他实现这个算法,前提当然是不能使用类库. 例如: how are you 的反转结果为 you are how. 算法1: 是我当 ...
- javaEE-----org.springframework.dao.InvalidDataAccessApiUsageException: Write operation
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read ...
- 带head的gridview
这是github上的一个项目,根据谷歌的那个HeadGridView改的,因为谷歌的那个addHeadView后宽度不能填充屏幕,下面是代码. 来源:https://github.com/liaohu ...
- 后台给前台传JSON字符串,前台解析并拼接显示
后台传JSON public class CourseType : IHttpHandler { Epoint.PeiXun.Bizlogic.BLL.CourseLibrary.PX_CourseT ...
- springmvc 自定义注解 以及自定义注解的解析
1,自定义注解名字 @Target({ElementType.TYPE, ElementType.METHOD}) //类名或方法上@Retention(RetentionPolicy.RUNTI ...
- CE 消息处理
MFC消息发送: static HANDLE hWnd =FindWindow(NULL,_T("Client")); //找到窗口 if(hWnd == INVALID_HAND ...
- Base64加密与MD5的区别?
MD5是一种不可逆的摘要算法.而Base64是一种编码方式,主要用于将二进制数据转换为文本数据,方便使用HTTP协议等,是可逆的.无论多少二进制数据,在MD5算法一定的情况下,都会变成一个定长的数据, ...