在delphi中如何動態建立類的例項

2021-09-22 03:51:32 字數 2976 閱讀 2775

在物件導向語言中,用兩種方法建立類的例項:靜態建立和動態建立。靜態建立就是在程式中顯式地建立類的例項,如c1 = tclass1.create()。而動態建立是在只知道類名的前題下建立類的例項。動態建立在實現上要比靜態建立更靈活,因為動態建立無需引用被建立類,並且更容易實現如多型等物件導向特性。

一、    動態建立類的例項

在delphi中動態建立類的例項可分為4步。

1. 宣告乙個從tpersistent繼承的類。因為在註冊類時要求必須從tpersistent繼承。

2. 註冊類。可以使用registerclass等過程進行註冊。

3. 驗證類是否被註冊(可選)。如果確定要建立的類已經註冊了,可以省略此步。

4. 得到並建立類。可使用findclass(classname)得到要建立的類,然後使用create方法建立類的例項。

下面給出乙個動態建立類例項的簡單實現。

第一步的**

tclass1 = class(tpersistent)

public

function getvalue(): string;

end;

function tclass1.getvalue(): string;

begin

result := 'hello world';

end;

第二步的**

initialization //可將這兩行放在end.的前面

registerclass(tclass1);

第三步和第四步的**

procedure tform1.button1click(sender: tobject);

varclass1: tclass1;

begin

if getclass('tclass1')<>nil then

begin

class1 := findclass('tclass1').create as tclass1;

showmessage(class1.getvalue);

end;

end;

在delphi 中不僅可以根據類名動態建立類的例項,而且在註冊時可以給類起乙個別名,在建立類的例項時即可以使用類名,也可以使用別名。如上述**中 registerclass(tclass1);可改為registerclassalias(tclass1, 『class1』);。而findclass(『tclass1』)也可改為findclass(『class1』)。另外,如果註冊的模擬較多,也可使用registerclasses一次註冊多個類。registerclasses的定義如下。

procedure registerclasses(aclasses: array of tpersistentclass);

首先宣告乙個tpersistentclass型別的陣列,然後將要註冊的類按順序賦到這個陣列中,最後呼叫registerclasses即可。

二、通過動態建立實現多型

多型在程式設計中是非常重要的概念之一。它主要是通過繼承來實現的。簡單地說,就是n個類從乙個類繼承或實現乙個介面,這n個類繼承父類的所有 virtual方法或實現父介面的所有方法,並做出不同的實現。這n個類的實現都不一樣,而它們的呼叫確是一樣的,即對於呼叫來說是透明的。

如果使用靜態建立類例項的方法實現多型,當類很多時需要進行大量的判斷。而使用動態建立類例項的方法只要將子類的類名或別名當做引數傳入即可。下面舉乙個例子如何在delphi中利用動態建立類例項的方法實現多型。

//定義父類

tclassparent = class(tpersistent)

public

//這是乙個抽象虛函式,相當於c++的純虛函式

function greet(name: string): string; virtual; abstract;  

end;

//定義兩個子類

tenglish = class(tclassparent)

function greet(name: string): string; override;

end;

tchinese = class(tclassparent)

function greet(name: string): string; override;

end;

//實現兩個子類的greet函式

function tenglish.greet(name: string): string;

begin

result := 'hello ' + name;  //返回英文的問候

end;

function tchinese.greet(name: string): string;

begin

result := '您好 ' + name;  //返回中文的問候

end;

//註冊兩個子類

initialization

registerclassalias(tenglish, 'eng');

registerclassalias(tchinese, 'chn');

//根據使用者的選擇建立類的例項

procedure tform1.button2click(sender: tobject);

varparent: tclassparent;

begin    

if getclass(combobox1.items[combobox1.itemindex])<>nil then

begin

//此處findclass的引數可以是類名,也可以是別名

//本例中將類名放入了combobox中

parent :=  findclass(combobox1.items[combobox1.itemindex]).create as tclassparent;

showmessage(parent.greet('bill gates'));

end;

end;

程式介面

在delphi中如何動態建立類的例項

在物件導向語言中,用兩種方法建立類的例項 靜態建立和動態建立。靜態建立就是在程式中顯式地建立類的例項,如c1 tclass1.create 而動態建立是在只知道類名的前題下建立類的例項。動態建立在實現上要比靜態建立更靈活,因為動態建立無需引用被建立類,並且更容易實現如多型等物件導向特性。一 動態建立...

在Delphi中如何動態更改DBGrid的顏色

dbgrid控制項是乙個有許多使用者介面的顯示資料庫的控制項,以下的程式告訴您如何根據顯示的內容改變字型的顯示顏色。例如,如果乙個城市的人口大於200萬,我們就讓它顯示為藍色。使用的控制項事件為dbgrid.ondrawcolumecell.procedure tform1.dbgrid1drawc...

DELPHI動態建立窗體

第一種方式 procedure tform1.btn1click sender tobject begin try showmodal finally free end end 第二種方式 procedure tform1.btn2click sender tobject begin if not ...