本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!
在面向?qū)ο笳Z(yǔ)言中,用兩種方法建立類的實(shí)例:靜態(tài)建立和動(dòng)態(tài)建立。靜態(tài)建立就是在程序中顯式地建立類的實(shí)例,如c1 =
TClass1.Create()。而動(dòng)態(tài)建立是在只知道類名的前題下建立類的實(shí)例。動(dòng)態(tài)建立在實(shí)現(xiàn)上要比靜態(tài)建立更靈活,因?yàn)閯?dòng)態(tài)建立無(wú)需引用被建立
類,并且更容易實(shí)現(xiàn)如多態(tài)等面向?qū)ο筇匦浴?br />
一、 動(dòng)態(tài)建立類的實(shí)例
在delphi中動(dòng)態(tài)建立類的實(shí)例可分為4步。
1. 聲明一個(gè)從TPersistent繼承的類。因?yàn)樵谧?cè)類時(shí)要求必須從TPersistent繼承。
2. 注冊(cè)類。可以使用RegisterClass等過(guò)程進(jìn)行注冊(cè)。
3. 驗(yàn)證類是否被注冊(cè)(可選)。如果確定要建立的類已經(jīng)注冊(cè)了,可以省略此步。
4. 得到并建立類。可使用FindClass(classname)得到要建立的類,然后使用Create方法建立類的實(shí)例。
下面給出一個(gè)動(dòng)態(tài)建立類實(shí)例的簡(jiǎn)單實(shí)現(xiàn)。
第一步的代碼
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);
var
class1: TClass1;
begin
if GetClass('TClass1')<>nil then
begin
class1 := FindClass('TClass1').Create as TClass1;
showmessage(class1.GetValue);
end;
end;
在delphi
中不僅可以根據(jù)類名動(dòng)態(tài)建立類的實(shí)例,而且在注冊(cè)時(shí)可以給類起一個(gè)別名,在建立類的實(shí)例時(shí)即可以使用類名,也可以使用別名。如上述代碼中
RegisterClass(TClass1);可改為RegisterClassAlias(TClass1,
‘class1’);。而FindClass(‘TClass1’)也可改為FindClass(‘class1’)。另外,如果注冊(cè)的類比較多,也可使
用RegisterClasses一次注冊(cè)多個(gè)類。RegisterClasses的定義如下。
procedure RegisterClasses(AClasses: array of TPersistentClass);
首先聲明一個(gè)TpersistentClass類型的數(shù)組,然后將要注冊(cè)的類按順序賦到這個(gè)數(shù)組中,最后調(diào)用RegisterClasses即可。
二、通過(guò)動(dòng)態(tài)建立實(shí)現(xiàn)多態(tài)
多
態(tài)在程序設(shè)計(jì)中是非常重要的概念之一。它主要是通過(guò)繼承來(lái)實(shí)現(xiàn)的。簡(jiǎn)單地說(shuō),就是n個(gè)類從一個(gè)類繼承或?qū)崿F(xiàn)一個(gè)接口,這n個(gè)類繼承父類的所有
virtual方法或?qū)崿F(xiàn)父接口的所有方法,并做出不同的實(shí)現(xiàn)。這n個(gè)類的實(shí)現(xiàn)都不一樣,而它們的調(diào)用確是一樣的,即對(duì)于調(diào)用來(lái)說(shuō)是透明的。
如果使用靜態(tài)建立類實(shí)例的方法實(shí)現(xiàn)多態(tài),當(dāng)類很多時(shí)需要進(jìn)行大量的判斷。而使用動(dòng)態(tài)建立類實(shí)例的方法只要將子類的類名或別名當(dāng)做參數(shù)傳入即可。下面舉一個(gè)例子如何在delphi中利用動(dòng)態(tài)建立類實(shí)例的方法實(shí)現(xiàn)多態(tài)。
//定義父類
TClassParent = class(TPersistent)
public
//這是一個(gè)抽象虛函數(shù),相當(dāng)于c++的純虛函數(shù)
function Greet(name: string): string; virtual; abstract;
end;
//定義兩個(gè)子類
TEnglish = class(TClassParent)
function Greet(name: string): string; override;
end;
TChinese = class(TClassParent)
function Greet(name: string): string; override;
end;
//實(shí)現(xiàn)兩個(gè)子類的Greet函數(shù)
{ TClassEnglish }
function TEnglish.Greet(name: string): string;
begin
result := 'hello ' + name; //返回英文的問(wèn)候
end;
{ TClassChinese }
function TChinese.Greet(name: string): string;
begin
result := '您好 ' + name; //返回中文的問(wèn)候
end;
//注冊(cè)兩個(gè)子類
initialization
RegisterClassAlias(TEnglish, 'eng');
RegisterClassAlias(TChinese, 'chn');
//根據(jù)用戶的選擇建立類的實(shí)例
procedure TForm1.Button2Click(Sender: TObject);
var
parent: TClassParent;
begin
if GetClass(combobox1.Items[combobox1.itemindex])<>nil then
begin
//此處FindClass的參數(shù)可以是類名,也可以是別名
//本例中將類名放入了combobox中
parent := FindClass(combobox1.Items[combobox1.itemindex]).Create as TClassParent;
showmessage(parent.Greet('bill gates'));
end;
end;
程序界面
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining