zoukankan      html  css  js  c++  java
  • 关于子类与父类的转换, 还有多态的说明 回复 "靳承柱" 和 "志成" 的问题

    问题来源: http://www.cnblogs.com/del/archive/2008/08/22/1002959.html#1294593

    //关于父类与子类的类型转换:
    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;
    
  • 相关阅读:
    使用SVG symbols建立图标系统完整指南
    ural 1874 Football Goal
    ural 1572 Yekaterinozavodsk Great Well
    ural 1084 Goat in the Garden
    ural 1192 Ball in a Dream
    ural 1020 Rope
    ural 1494 Monobilliards
    ural 1671 Anansi's Cobweb
    ural 1613 For Fans of Statistics
    ural 1126 Magnetic Storms
  • 原文地址:https://www.cnblogs.com/del/p/1273923.html
Copyright © 2011-2022 走看看