Delphi的學習筆記十二 方法

2021-07-12 03:40:31 字數 4714 閱讀 7486

一、

1.類的虛方法(virtual)和動態方法(dynamic)

方法的定義:

[delphi]view plain

copy

tmyclass = 

class

procedure

proc1(x,y: real); virtual;   

//虛方法

function

fun1(x,y: real): real; virtual;  

procedure

proc2(x,y: real); dynamic;   

//動態方法

function

fun2(x,y: real): real; dynamic;  

end;  

在子類中要實現父類的方法,就必須加上override,例如:

[delphi]view plain

copy

tbass = 

class

procedure

proc(x,y: real); virtual;  

function

fun(x,y: real): real; dynamic;  

end;  

tchild = class

(tbass)  

procedure

proc(x,y: real); override;  

function

fun(x,y: real): real; override;  

end;  

虛方法和動態方法的區別。

每個類都內含著兩個表: 虛方法表(vmt)和動態方法表(dmt):

1.1 vmt 表包含著本類與其所有父類的虛方法 - 那一般會是乙個比較龐大的表;

1.2 dmt 表只包含本類的動態方法 - 如果要呼叫其上層類的動態方法, 只能逐級查詢;

因此,使用虛方法速度上會有優勢(是實現多型行為的最有效的實現方式),使用動態方法會節約記憶體(大量要被許多派生類繼承的方法、但只是偶爾才覆蓋)。

reintroduce(重新引入):當隱藏乙個先前宣告的虛方法時,不給出警告資訊(要使用新方法隱藏繼承下來的虛方法)。

2.類的靜態方法

靜態方法是預設的,如果不是虛方法(virtual)或者純虛方法,則它就是靜態方法。靜態方法就是給類屬性來呼叫的,它可以存在於私有區。例如:

[delphi]view plain

copy

tmyclass = 

class

(tobject)  

private

class

varfname: 

string

;  class

procedure

setname(

const

value: 

string

); static; 

published

class

property

name: 

string

read fname 

write

setname;  

end;  

3.類的類方法。

類方法是通過類名就可以訪問的方法。類方法不能在private 和 protected 區;類方法不能是虛方法;類方法只能使用類中的、在物件例項化以前的資料。

3.1 類方法的定義

[delphi]view plain

copy

tmyclass = 

class

(tobject)  

class

procedure

alert(s:

string

);  

end;  

3.2 類方法的實現與其他方法的實現類似

3.3 類方法的呼叫

類方法的呼叫可以通過兩種方式來呼叫:1是通過類名.方法的形式,例如tmyclass.alert();2.是通過類的物件名來進行呼叫

4.抽象方法

抽象方法是為了實現介面的功能而存在的,抽象方法是乙個虛方法或者動態方法,也叫純虛方法。抽象方法在本類中只有定義、沒有實現;方法是在子類中實現。如果乙個類中有抽象方法,那麼該類就為抽象類,抽象類只能通過子類來例項化。最典型的抽象類是tstring,其實例化需要用tstringlist來實現。在delphi7及其以前的版本中,我們需要通過檢視類中是否包含抽象方法來判斷這個類是否為抽象類。

4.1 抽象方法的定義

[delphi]view plain

copy

tmyclass = 

class

(tobject)  

procedure

proc1; virtual; abstract;      

function

fun: 

string

; dynamic; abstract; 

end;  

4.2 抽象方法的實現

抽象方法的實現與實現虛方法或者動態方法一致,通過覆蓋(override)指示字來實現。

5.如果帶有sealed和final指示字的方法,是無法被繼承和覆蓋的。

二、1.構造方法和析構方法

我們都知道,構造方法是用來建立和初始化乙個例項物件的方法;析構方法是在物件銷毀時呼叫並釋放記憶體。例如:

[delphi]view plain

copy

tmyclass = 

class

(tobject)  

public

constructor

create;           

destructor

destroy; override; 

end;  

必須使用constructor和destructor來定義,其實現如下:

[delphi]view plain

copy

constructor

tmyclass

.create;  

begin

inherited

;  //...

end;  

destructor

tmyclass

.destroy;  

begin

//...

inherited

;  end

;  

這裡,create是用的最多的方法,而destory則是用的最少的方法,因為系統已經為我們定義了free方法來處理,這比單單用destory會更安全。

要呼叫構造或者析構函式,必須使用乙個例項物件的引用:

[delphi]view plain

copy

myobject

.destroy;  

2.訊息方法

我們先來看一下訊息方法的定義:用來響應動態分派的訊息。

[delphi]view plain

copy

procedure

keydown(

varmsg:twmkeydown);message wm_keydown;  

訊息方法與其他方法的不同在於,其後多了乙個message指示字,後面是攔截的訊息名稱wm_keydown。

訊息方法的實現

[delphi]view plain

copy

procedure

tform1

.keydown(

varmsg: twmkeydown);  

begin

ifchr(message

.charcode) = #

13then

self.

text := char(msg

.charcode);  

end;  

訊息方法與事件方法如在同乙個窗體中,訊息方法會攔截事件方法。如需要事件方法和訊息方法都能執行,則可以按如下操作:

[delphi]view plain

copy

procedure

tform1

.keydown(

varmsg: twmkeydown);  

begin

showmessage('訊息: '

+ char(msg

.charcode));  

inherited

;  end

;  procedure

tform1

.keydown(

varmsg: twmkeydown);  

begin

inherited

;  showmessage('訊息: '

+ char(msg

.charcode));  

end;  

3.方法的呼叫約定

delphi預設對引數的讀取是從左到右,window api是從右到左。

delphi學習筆記 TADOQuery

delphi 資料庫查詢 tadoquery 在乙個程式中你會多次查詢資料庫的,因此在你寫的查詢方法中定義乙個區域性的adoquery就可以了,它返回乙個資料集 recordset。最簡單的應用如下 function getdata recordset 獲取一張表中的全部資料 recordset是一...

How Tomcat Works學習筆記《十二》

host和engine 在catalina中engine代表catalina實體,host代表乙個虛擬的主機,engine包括多個host,乙個host包括多個context。在tomcat中host用org.apache.catalina.host介面表示 public inte cehostex...

Linux 學習筆記 十二

打包表示把一堆檔案變成乙個包裹,打包是必須指定要打包的檔案。tar 打包工具 f 指定包的名字 c 建立包 v 顯示建立過程 t 檢視包中內容 x 解包 r 新增檔案到包中 delete filename 刪除包中指定檔案 get filename 取出包中指定檔案 例 tar cf etc.tar...