delphi self 的使用
delphi self 的使用
delphi之self
在使用delphi的對象技術(shù)的時(shí)候,經(jīng)常會看到一個(gè)詞匯:self,它到底指的是什么呢?
我們還要從對象與類的關(guān)系談起。 類是對將要?jiǎng)?chuàng)建的對象的性質(zhì)的描述,是一種文檔。這很重要:
類只是一段描述性的文字,它并不會真去分配內(nèi)存,無論在其中定義多少變量。 如果打個(gè)比方,
類就是圖紙,而對象就是根據(jù)圖紙蓋的房子。對象是真正在 內(nèi)存中存在的東西,是運(yùn)行“實(shí)體”。
根據(jù)一份圖紙可以蓋多個(gè)相似的房子,同 樣道理,根據(jù)一個(gè)類,可以創(chuàng)建多個(gè)類似的對象,
這個(gè)過程叫做“實(shí)例化”。在delphi中使用對象技術(shù),要遵循以下的步驟:
1。定義一個(gè)類
2。用該類聲明一個(gè)名字(實(shí)質(zhì)是一個(gè)指針)
3。用該類實(shí)例化一個(gè)對象,并使它與先前的名字聯(lián)系起來
4。調(diào)用對象的方法或?qū)傩?/p>
5。釋放對象
下面我們寫一個(gè)最簡單的表達(dá)累加器功能的類
type
TCount = class
private
FNum: integer; // 記錄有多少個(gè)數(shù)字被累加
FSum: integer; // 當(dāng)前的累加和
pubic
procedure Add(n: integer) // 把整數(shù)n累加進(jìn)去
procedure clear; // 清零
procedure show; // 顯示當(dāng)前信息
constructor create; // 構(gòu)造函數(shù)
end;
....
使用的過程是這樣的:
var a: TCount; // 這里只是聲明了一個(gè)名字,并非真正地分配了一個(gè)對象
...... // a這個(gè)變量只占用4字節(jié)地內(nèi)存
a := TCount.create; // 在堆空間中分配內(nèi)存,并把首地址拷貝到a中。
a.add(5);
a.add(7);
a.show(); // 以上是調(diào)用a對象的有關(guān)方法
a.free; // free會去調(diào)用析構(gòu)函數(shù),完成堆空間的釋放。
我們看這樣一個(gè)問題:一個(gè)對象到底占用多大的內(nèi)存空間?
答案是很小!因?yàn)樵诜峙湟粋€(gè)對象地時(shí)候,實(shí)際上只分配了類中定義的數(shù)據(jù),
而沒有分配其中的函數(shù)所需要的空間。這些類中定義的函數(shù)(稱為成員函數(shù)),
與普通函數(shù)一樣被存放在靜態(tài)地址空間中。
這樣就引出了第二個(gè)問題:既然對象的數(shù)據(jù)和操作這些數(shù)據(jù)的方法不是存在一起,
那么這些函數(shù)如何才能知道到底要操作哪個(gè)數(shù)據(jù)塊呢?(類可生成多個(gè)實(shí)例)
顯然,最容易想到的解決辦法就是讓這些特殊函數(shù)帶一個(gè)參數(shù),是個(gè)指針類型,
該指針指示要操作的數(shù)據(jù)塊的首地址。
事實(shí)上,成員函數(shù)正是這樣做的,它們有一個(gè)缺省的參數(shù)self,這是個(gè)指針類型,
對于上邊的例子,它的定義就是:TCount self。編譯器在遇到調(diào)用a.add(5)的時(shí)候,
把它解釋為:TCount.add(a,5);把代表對象的數(shù)據(jù)塊的地址送給add函數(shù)作為第一個(gè)參數(shù)--隱含的參數(shù)。
說得本質(zhì)一些就是:self是當(dāng)前正在執(zhí)行本函數(shù)的那個(gè)對象的數(shù)據(jù)塊的首地址。
self既然代表對象自己,那么難道自己還用定義嗎?看下邊的代碼:
procedure TForm1.button1click(sender: TObject);
var
a: TButton;
begin
a := Tbutton.create(self);
....
end;
在創(chuàng)建Tbutton類的對象的時(shí)候,需要給出一個(gè)內(nèi)存管理者。
self就表示了正在運(yùn)行button1click這個(gè)過程的那個(gè)對象(的數(shù)據(jù)塊的首地址)。其實(shí)大多數(shù)情況下就是form1。//這里的理解有點(diǎn)問題應(yīng)該是OWER管理者
?
Delphi之覆蓋和隱藏
如果一個(gè)子類方法聲明指定的標(biāo)識符與繼承得到的方法具有相同的名稱,
但是未包含override,那么新的聲明只是隱藏(hides)了父類方法。也就是說子類和父類方法同樣存在,
父類方法是靜態(tài)的,并未被覆蓋,例如:
type
T1=class(TObject)
???? procedure Act;virtual;//virtual也好,或則dynamic也好,只是說明此方法可被覆蓋
end;
T2=class(T1)
???? procedure Act;//Act再次被聲明,但是因?yàn)闆]有被聲明為overriden,所以沒有覆蓋父類T1的相應(yīng)方法
end;
var
???? SomeObject:T1;
begin
????? SomeObject:T2.Create;
????? SomeObject.Act;//這里實(shí)際調(diào)用的是T1.Act
end;
關(guān)于Sender,Self,Owner和parent
?
Sender--意義:指本對象。
Sender在什么對象相關(guān)代碼里,那么Sender就是什么。
Self--意義:指本類,也就是Self被引用的類。比如若在類TMyClass內(nèi)引用了Self,
那么Self=TMyClass.
Owner--意義:哪個(gè)對象釋放我的內(nèi)存啊?
如:Pan:=TPanel.Create(Self);其中Create的參數(shù)是:AOwner:TComponent。
Owner釋放Pan的內(nèi)存。因?yàn)榇翱卺尫臥an的內(nèi)存,
但窗口類的對象是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--
意義:此對象包括在哪個(gè)對象里那?
說明:若組件不是從TControl繼承來的,那么在創(chuàng)建組件后不必聲明此屬性。
?
?
轉(zhuǎn)自:http://hi.baidu.com/xingfupingguo/item/79e2291647c768f686ad4e47
轉(zhuǎn)載于:https://www.cnblogs.com/linguoqiu/archive/2013/01/11/2855893.html
總結(jié)
以上是生活随笔為你收集整理的delphi self 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安全性测试
- 下一篇: 程序员成长的三个方法