對象的本質
- 計算機內存常用的有兩塊,棧(stack)和堆(heap)。
- 對象的引用存儲在棧中,棧中的變量是不需要由程序員手動去釋放內存空間的。簡單數據類型的值和對象的引用存儲在棧中,對象存儲在堆中。
- 查看創建對象所佔用內存的大小,調用InstanceSize()方法,從TObject繼承。
- 對象引用和類引用。對象是類的動態實例,對象總是被動態分配到堆上,一個對象引用就如同一個句柄或者一個指針。一個對象引用通常以一個變量的形式存在,也有函數或者屬性返回值的形式。類引用類型是類的模板。類引用最普遍的使用是通過調用構造函數來生成該類的實例,也可以用引用類測試對象類型(is)或者將對象轉換爲特定類型(as)。
- 常用的參數牀底機制分爲值傳遞和引用傳遞(var)。
- 賦值操作符(:=)將一個對象的以用賦值給一個對象變量。Assign和AssignTo方法可以將對象屬性進行賦值。
- 簡單的數據類型(如Integer,Char,Record等)無論作爲參數還是變量都是按值傳遞和使用的,通常稱爲值類型。對象變量是引用類型變量,分配一個對象引用給一個變量時,Delphi僅複製引用,而不是整個對象。
對象的生死
Delphi用Constructor聲明一個構造函數Create,可在對象產生的時候調用。用Destructor聲明一個析構函數Destroy,將在對象銷燬的時候調用。
- Destroy直接銷燬對象,Free會檢查對象是否存在,如對象存在,或者對象不爲空,調用Destroy。FreeAndNil調用Free後將對象置爲空。
- 構造時應該從基類開始按繼承的層次孫旭調用,析構的時候順序正好相反。
- 屬主(owner)機制。屬主(owner)機制就是設計模式中典型的結構型模式COMPOSITE(組合),Application向其所擁有的對象發送析構的消息的方式,典型的行爲模式Observer(觀察者)。
- 示例程序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;
- 創建有屬主的組件不需要手工銷燬,創建組件時指定屬主在效率上不划算。
- 對象的關係
(1)泛化關係:表現類(對象)的父子繼承特性。
(2)聚合和組合關係:表現類(對象)的部分和整體的合成特性。
(3)依賴和合作關係:表現類(對象)的互作用特性。 -
原始數據(簡單的數據類型)和對象(類類型)的區別。原始數據可以看作一個只有單一屬性並且不具有方法的簡單對象。
- 繼承和合成,TVehicle(車輛)類由TWheel(輪胎)合成, TBicycle繼承了TVehicle,TCar繼承TVehicle並且由FEngine(發動機)合成。
- 合成包含組合和聚合。發動機對於TCar是組合(生命週期依賴騎車的生命期),GPS導航系統對於TCar是聚合(生命週期無需依賴騎車的生命期),下圖是UML示例圖。
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;
- 依賴關係和合作關係
TPerson類的對象與TCar類的對象與TBicycle類的對象存在依賴關係。虛線指向依賴。GPS導航系統與人之間是合作關係,用實線表示。