delphi self 的使用
delphi之self
在使用delphi的對象技術的時候,經常會看到一個詞匯:self,它到底指的是什么呢?
我們還要從對象與類的關系談起。 類是對將要創建的對象的性質的描述,是一種文檔。這很重要:
類只是一段描述性的文字,它並不會真去分配內存,無論在其中定義多少變量。 如果打個比方,
類就是圖紙,而對象就是根據圖紙蓋的房子。對象是真正在 內存中存在的東西,是運行“實體”。
根據一份圖紙可以蓋多個相似的房子,同 樣道理,根據一個類,可以創建多個類似的對象,
這個過程叫做“實例化”。在delphi中使用對象技術,要遵循以下的步驟:
1。定義一個類
2。用該類聲明一個名字(實質是一個指針)
3。用該類實例化一個對象,並使它與先前的名字聯系起來
4。調用對象的方法或屬性
5。釋放對象
下面我們寫一個最簡單的表達累加器功能的類
type
TCount = class
private
FNum: integer; // 記錄有多少個數字被累加
FSum: integer; // 當前的累加和
pubic
procedure Add(n: integer) // 把整數n累加進去
procedure clear; // 清零
procedure show; // 顯示當前信息
constructor create; // 構造函數
end;
....
使用的過程是這樣的:
var a: TCount; // 這里只是聲明了一個名字,並非真正地分配了一個對象
...... // a這個變量只占用4字節地內存
a := TCount.create; // 在堆空間中分配內存,並把首地址拷貝到a中。
a.add(5);
a.add(7);
a.show(); // 以上是調用a對象的有關方法
a.free; // free會去調用析構函數,完成堆空間的釋放。
我們看這樣一個問題:一個對象到底占用多大的內存空間?
答案是很小!因為在分配一個對象地時候,實際上只分配了類中定義的數據,
而沒有分配其中的函數所需要的空間。這些類中定義的函數(稱為成員函數),
與普通函數一樣被存放在靜態地址空間中。
這樣就引出了第二個問題:既然對象的數據和操作這些數據的方法不是存在一起,
那么這些函數如何才能知道到底要操作哪個數據塊呢?(類可生成多個實例)
顯然,最容易想到的解決辦法就是讓這些特殊函數帶一個參數,是個指針類型,
該指針指示要操作的數據塊的首地址。
事實上,成員函數正是這樣做的,它們有一個缺省的參數self,這是個指針類型,
對於上邊的例子,它的定義就是:TCount self。編譯器在遇到調用a.add(5)的時候,
把它解釋為:TCount.add(a,5);把代表對象的數據塊的地址送給add函數作為第一個參數--隱含的參數。
說得本質一些就是:self是當前正在執行本函數的那個對象的數據塊的首地址。
self既然代表對象自己,那么難道自己還用定義嗎?看下邊的代碼:
procedure TForm1.button1click(sender: TObject);
var
a: TButton;
begin
a := Tbutton.create(self);
....
end;
在創建Tbutton類的對象的時候,需要給出一個內存管理者。
self就表示了正在運行button1click這個過程的那個對象(的數據塊的首地址)。其實大多數情況下就是form1。//這里的理解有點問題應該是OWER管理者
Delphi之覆蓋和隱藏
如果一個子類方法聲明指定的標識符與繼承得到的方法具有相同的名稱,
但是未包含override,那么新的聲明只是隱藏(hides)了父類方法。也就是說子類和父類方法同樣存在,
父類方法是靜態的,並未被覆蓋,例如:
type
T1=class(TObject)
procedure Act;virtual;//virtual也好,或則dynamic也好,只是說明此方法可被覆蓋
end;
T2=class(T1)
procedure Act;//Act再次被聲明,但是因為沒有被聲明為overriden,所以沒有覆蓋父類T1的相應方法
end;
var
SomeObject:T1;
begin
SomeObject:T2.Create;
SomeObject.Act;//這里實際調用的是T1.Act
end;
關於Sender,Self,Owner和parent
Sender--意義:指本對象。
Sender在什么對象相關代碼里,那么Sender就是什么。
Self--意義:指本類,也就是Self被引用的類。比如若在類TMyClass內引用了Self,
那么Self=TMyClass.
Owner--意義:哪個對象釋放我的內存啊?
如:Pan:=TPanel.Create(Self);其中Create的參數是:AOwner:TComponent。
Owner釋放Pan的內存。因為窗口釋放Pan的內存,
但窗口類的對象是Self.一般給Owner傳Self就可以。
比如:
代碼段一:
pan:=TPanel.Create(Self);
with Pan do begin
try
Left:=20;
Top:=20;
parent:=Self; //Parent:=Form1也可以。
Visible:=true;
ShowMessage('Created');
finally
Pan.free;
end;
end;
-----------------------------------------------------
Parent--
意義:此對象包括在哪個對象里那?
說明:若組件不是從TControl繼承來的,那么在創建組件后不必聲明此屬性。
轉自:http://hi.baidu.com/xingfupingguo/item/79e2291647c768f686ad4e47