delphi的類及其對象
一 概述
其實類只是複雜的數據結構。這種數據結構可以有她的實體那就是對象。但要區分好類的靜態數據與對象數據區別,類方法與對象方法的區別。前者是類所有對象共享,後者是對象特有。
二 類的聲明及對象的定義
在delphi裏有兩類類,一種是繼承自內建類,一種是自定義或繼承自自定義類,這兩者不僅聲明的方式不一樣,內存管理方面也不一樣。
1 a
繼承自內建類的類的聲明
type myclass=class(內建類)
end;
或
type myclass=class//默認繼承自 T OBJECT
end;
b
繼承自內建類對象的構造:通過create方法返回一個指向對象實體的指針。
繼承自內建類對象的析構 有兩種方法 destroy 與free
destroy 只是把對象的頭指針指向空,但實體的空間並沒有被釋放掉。free就可以完全把空間釋放掉。
2自定義類的聲明
type myclass=object(parentclass)
end;
或 完全自定義
type myclass=object
end;
自定義類的對象若不自定義構造函數則只是一般的變量,在編譯時動態分配。
三 delphi對類成員的封裝等級
1 private
只在該單元的該類中可見
2 protected
除在該單元的本類內可見外,其子類在也可見。//對象應該不可見
3 public
任何引用該類的地方都可見。包括該類的對象。
4 published
與public差不多,但在對象監視器內可見
5 automated
也與 public差不多
四 類的繼承
1
父類被子類繼承後再子類中有塊區域與子類中的成員不再一個層次上,雖然子類可覆蓋父類的成員,但其實父類中的成員是存在的。
2 方法的修飾符
默認情況下是static (此修飾符修飾的方法不可被子類覆蓋),還有 virtual,dynamic(此修飾符修飾的方法可被子類覆蓋)修飾符。
virtual,dynamic修飾符的區別:使用 virtual修飾符修飾的方法,當子類中的方法覆蓋時,效率比較高,而dynamic修飾的方法佔空間少。所以當父類中有大量需要子類重載,但重載的機會又比較小時用dynamic修飾。
3 override(覆蓋)
覆蓋時不僅要參數類型要一致,連返回值的也要一樣。只是可以修改內部方法。父類中有virual修飾的方法但子類不一定要覆蓋,且無論該子類有沒有覆蓋,該子類的子類都還可以再覆蓋。
EG:override的例子
type myclass1=class
function myfunc;virtual;//說明該方法可被覆蓋
end;
type myclass2=class(myclass1)
function myfunction;override; //覆蓋了父類中同名方法
end;
四 overload 及 重定義
重定義是雖然父類中有被virual修飾的方法,在子類中還可以寫個同名的方法,但不override
overload 是多態:在同一個類內,同名的幾個函數,有不同的參數。以相應不同的要求。
myfunction(a:integer);overload;
myfunction(a:string);overload;
myfunction(a:float);overload;
五 類方法
delphi中不支持類成員但支持類函數,就是在方法前加class在不同的對象中就可共享次方法。
class function staticfun;//類方法
六 純虛函數
擁有此方法的類必定有多態的事實,因爲它的子類必須實現這個純虛函數。
聲明的方法
function myfunc:virtual;abtract;