释放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;
浙公网安备 33010602011771号