zoukankan      html  css  js  c++  java
  • 用接口关联对象的生命周期(二)

    //接上次讨论

    //测试代码如下

    procedure TForm1.btnRaiseTestClick(Sender: TObject);
    var
      lvIntf2: ITest;
      lvVIList: TVIList;
    begin
      lvVIList := TVIList.Create(false); //不使用List管理接口对象生命周期
      try

        //+1
        lvVIList.Add('abc', TTestIntfObject.Create);

        //+1 +1
        lvIntf2 := (lvVIList.GetInterfaceByKey('abc') as ITest);
        lvIntf2.DoWork;
        raise Exception.Create('raise error');
      finally
        //-1
        lvVIList.Remove('abc');
        lvVIList.Free;
      end;
    end;

    //经过上次讨论局部的接口变量在函数执行完毕时会进行隐含如下赋值

    lvIntf2:=nil;

    lvTempIntf:=nil;  //lvTempIntf为假想的接口是一个IInterface类型。因为 as会产生一个临时的接口

    //经过上上述代码跟踪测试即使raise后,局部接口变量仍然会得到隐含的赋值

    //但是对象不会隐含执行lvVIList.Free,可能也执行了lvVIList:=nil;(无法证实,猜想),在整个应用程

    //序退出的时候会执行Free,但是这样是不可控制的

  • 相关阅读:
    类的继承
    面向对象的编程
    Python的模块
    ES6_12_Set和Map数据结构以及for of循环
    ES6_11_字符串、数值、数组、对象扩展
    ES6_09_Generator函数
    ES6_08_Iterator遍历器
    ES6_07_Symbol属性
    ES6_05_三点运算符和形参默认值
    Sqlstate解释
  • 原文地址:https://www.cnblogs.com/DKSoft/p/2031464.html
Copyright © 2011-2022 走看看