Delphi面向對象編程思想讀書筆記3——理解對象

對象的本質

  1. 計算機內存常用的有兩塊,棧(stack)和堆(heap)。
  2. 對象的引用存儲在棧中,棧中的變量是不需要由程序員手動去釋放內存空間的。簡單數據類型的值和對象的引用存儲在棧中,對象存儲在堆中。
  3. 查看創建對象所佔用內存的大小,調用InstanceSize()方法,從TObject繼承。
  4. 對象引用和類引用。對象是類的動態實例,對象總是被動態分配到堆上,一個對象引用就如同一個句柄或者一個指針。一個對象引用通常以一個變量的形式存在,也有函數或者屬性返回值的形式。類引用類型是類的模板。類引用最普遍的使用是通過調用構造函數來生成該類的實例,也可以用引用類測試對象類型(is)或者將對象轉換爲特定類型(as)。
  5. 常用的參數牀底機制分爲值傳遞和引用傳遞(var)。
  6. 賦值操作符(:=)將一個對象的以用賦值給一個對象變量。Assign和AssignTo方法可以將對象屬性進行賦值。
  7. 簡單的數據類型(如Integer,Char,Record等)無論作爲參數還是變量都是按值傳遞和使用的,通常稱爲值類型。對象變量是引用類型變量,分配一個對象引用給一個變量時,Delphi僅複製引用,而不是整個對象。

    對象的生死

Delphi用Constructor聲明一個構造函數Create,可在對象產生的時候調用。用Destructor聲明一個析構函數Destroy,將在對象銷燬的時候調用。

  1. Destroy直接銷燬對象,Free會檢查對象是否存在,如對象存在,或者對象不爲空,調用Destroy。FreeAndNil調用Free後將對象置爲空。
  2. 構造時應該從基類開始按繼承的層次孫旭調用,析構的時候順序正好相反。
  3. 屬主(owner)機制。屬主(owner)機制就是設計模式中典型的結構型模式COMPOSITE(組合),Application向其所擁有的對象發送析構的消息的方式,典型的行爲模式Observer(觀察者)。
  4. 示例程序3-10 沒明白的地方
    constructor TControlFactory.create(Aowner: TWinControl;
    ControlClass: TControlClass);
    begin
    FControlObj :=  ControlClass.Create(Aowner);
    FControlObj.Parent := Aowner;
    FControlObj.Name := FControlObj.ClassName;
    FControlObj.SetBounds(10,10,250,150);
    self := TControlFactory(FControlObj);    //這句話不明白
    end;
  5. 創建有屬主的組件不需要手工銷燬,創建組件時指定屬主在效率上不划算。
  6. 對象的關係
    (1)泛化關係:表現類(對象)的父子繼承特性。
    (2)聚合和組合關係:表現類(對象)的部分和整體的合成特性。
    (3)依賴和合作關係:表現類(對象)的互作用特性。
  7. 原始數據(簡單的數據類型)和對象(類類型)的區別。原始數據可以看作一個只有單一屬性並且不具有方法的簡單對象。

  8. 繼承和合成,TVehicle(車輛)類由TWheel(輪胎)合成, TBicycle繼承了TVehicle,TCar繼承TVehicle並且由FEngine(發動機)合成。
  9. 合成包含組合和聚合。發動機對於TCar是組合(生命週期依賴騎車的生命期),GPS導航系統對於TCar是聚合(生命週期無需依賴騎車的生命期),下圖是UML示例圖。
    Delphi面向對象編程思想讀書筆記3——理解對象
  TGPSReceiver = class (TObject)
  public
    procedure Navigate;
  end;

  TEngine = class (TObject)
  private
    FCapacity: Integer;
    FPower: Integer;
  public
    procedure start;
    procedure stop;
  end;

  TWheel = class (TObject)
  private
    FNo: Integer;
    FSize: Integer;
    FTypeName: string;
    procedure check;
  public
    constructor create(size:Integer;TypeName:string;No:Integer);
  end;

  TVehicle = class (TObject)
  protected
    FColor: string;
    FMake: string;
    FTopSpeed: Integer;
    FWheel: TWheel;
    FWheels: TList;
    procedure SlowDown;
    procedure SpeedUp;
    procedure Start;
    procedure Stop;
  end;

  TBicycle = class (TVehicle)
  public
    constructor create;
    destructor Destory;
    procedure ride;
  end;

  TCar = class (TVehicle)
  private
    FGPSReceiver: TGPSReceiver;
    FTopSpeed: Integer;
  protected
    FEngine: TEngine;
  public
    constructor create(GPS:TGPSReceiver;color:string;Make:string;
            TopSpeed:Integer);
    destructor Destory;
    procedure drive;
    property GPSReceiver: TGPSReceiver read FGPSReceiver write FGPSReceiver;
    property TopSpeed: Integer read FTopSpeed write FTopSpeed;
  end;
  1. 依賴關係和合作關係

TPerson類的對象與TCar類的對象與TBicycle類的對象存在依賴關係。虛線指向依賴。GPS導航系統與人之間是合作關係,用實線表示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章