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

//关于父类与子类的类型转换:
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值