释放TStringList.Objects中对象的方法研究

本人习惯于将自己创建的对象放入到TStringList中,通常的释放代码都会写成如下:
var
  sl:TStringList;
  i:Integer;
begin
  sl:= TStringList.Create;
  try
    //do something here
    for  i:=0  to sl.Count - 1 do
    begin
      sl.Objects[i].Free;
    end;
    sl.Clear;
  finally
    sl.Free;
  end;
end;

某天看见别人的释放代码如下:
    TUserObj(sl.Objects[i]).Free;   
其中TUserObj代表用户自定义的某个类。
到底哪个是对的?两种方法都是正确的,但是我认为没有必要在进行类型转换。
下面说明原因:   
      在面向对象程序设计中,对象具有多态的特性,子类的实例是可以赋值到类型为父类的变量上。
      假设父类中的某个方法A被子类覆盖,那么在实际代码调用过程中,执行的是子类的方法A。
 
     Tobject是一切类的最原始基类,自定义类的Destroy方法会覆盖Tobject的Destroy方法。
     所以代码sl.Objects[i].Free; 中的Free调用的实际上是子类的TUserObj的Destroy方法。
 
     另外,在使用TStringList时,建议使用如下代码,也是在使用面向对象的多态特性。
var
  sl:TStrings;
begin
  sl:= TStringList.Create;
  try
    //do something here
    //................
  finally
    sl.Free;
  end;
end;   

posted on 2011-11-04 15:02  王海波  阅读(564)  评论(1)    收藏  举报

导航