您的位置:首页 > 其它

关于父类与子类的类型转换(TStrings与TStringList)

2009-04-11 10:10 260 查看
//关于父类与子类的类型转换:
procedure TForm1.FormCreate(Sender: TObject);
var
List1: TStrings;
List2: TStringList; {TStringList 是 TStrings 的子类}
begin
List1 := TStringList.Create; {List1 只能通过其子类实现}
//List1 := TStrings.Create;  {不能这样建立, 因为 TStrings 是抽象类, 不能自己实现}
List2 := TStringList.Create;

{TStrings 里没有排序方法 Sort}
//List1.Sort; {所以这样不行}
List2.Sort;   {List2 所属的 TStringList 有这个方法}

{但可以把 List1 转换一下}
TStringList(List1).Sort; {这就没问题了}

{但如果把 List2 转为 TStrings, 那 List2 也就丢失了 Sort}
//TStrings(List2).Sort; {所以这样不行}

List1.Free;
List2.Free;
end;

//为什么要那个抽象的父类? 答案有很多, 其中之一就是为了实现多态. 譬如:
procedure TForm1.FormCreate(Sender: TObject);
var
stream: TStream; {这是很多流类的祖先, 也是抽象类; 只能通过其子类来实例化}
begin
{可以用 TMemoryStream 来实现 stream}
stream := TMemoryStream.Create;
{...}
stream.Free;

{也可以用 TFileStream 来实现 stream}
stream := TFileStream.Create('c:/temp/Test.dat', fmCreate);
{...}
stream.Free;

{不同的实现会让 stream 拥有不同而又相似的功能}
end;

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: