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的转换的更多相关文章

  1. golang - interface的作用

    多态.struct 可以赋值给 interface.interface 可以转换成子接口,或者 struct. 请看go中的一段的源代码: listener, _ := net.Listen(&quo ...

  2. 从零搭建Spring Cloud Gateway网关(三)——报文结构转换

    背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...

  3. Delphi -- Compiler helper for initializing/finalizing variable

    it CompilerhelperForInitializingFinalizingVariable; interface { Compiler helper for initializing/fin ...

  4. Go学习笔记01-语言

    1.1 变量 Go 是静态类型语言,不能在运行期改变变量类型.使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器自动推断. var x int var f fl ...

  5. Go语言学习之6 反射详解

    1.反射: 定义: 反射就是程序能够在运行时检查变量和值,求出它们的类型.                   可以在运行时动态获取变量的相关信息                   Import ( ...

  6. Golang的反射reflect深入理解和示例

    编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...

  7. [golang]golang 汇编

    https://lrita.github.io/2017/12/12/golang-asm/#why 在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于 ...

  8. golang(11) 反射用法详解

    原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...

  9. Go反射

    一.引入 不同语言的反射模型不尽相同,有些语言还不支持反射.<Go 语言圣经>中是这样定义反射的: Go 语言提供了一种机制在运行时更新变量和检查它们的值.调用它们的方法,但是在编译时并不 ...

随机推荐

  1. http://zh.lucida.me/

    一个很厉害的在美国Google的学长的博客

  2. 关于break和continue的区别

    //break是结束整个循环体,continue是结束单次循环 比方说: while(x++ < 10){ if(x == 3) { break; } printf("%d\r\n&q ...

  3. C#获得网络连接信息 IPGlobalProperties

    IPGlobalProperties 提供有关本地计算机的网络连接的信息. 此类提供有关本地计算机的网络接口和网络连接的配置和统计信息 可以获取本机TCP UDP 丢包 发包等数据. 此类提供的信息与 ...

  4. CSS和CSS选择器

    一:CSS CSS有三种书写形式(优先级从高到低) 1)行内样式:(内联样式)直接在标签style属性中书写 2)内页样式:在本网页的style标签中书写 3)外部样式:在单独的CSS文件中书写,然后 ...

  5. JS原生效果瀑布流布局的实现(一)

    JS原生效果 实现: HTML页面布局: <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...

  6. java虚拟机之垃圾回收算法

    标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...

  7. Dedecms自定义表单后台列表展现方式更改

    Dedecms有自定义表单功能,方便我们收集用户信息.个人通常喜欢拿这个功能做问卷调查,在线留言等功能.但是如果使用过这个功能的朋友就会知道,Dedecms自定义表单后台列表展现方式并不好看. 上面就 ...

  8. HTML 标签 表格

    <html>    --开始标签 <head> 网页上的控制信息 <title>页面标题</title> </head> <body& ...

  9. Python实例3

    3.一个整数,它加上100后是一个完全平方数,再加上268又是一个完全平方数,请问该数是多少? 正解: 源码: #!/usr/bin/python # -*- coding: UTF-8 -*- im ...

  10. JSP代码加固

    String id = request.getParameter("id"); String id = id.replace("'","") ...