delphi 泛型之 動態建立類的物件

2021-10-01 07:20:33 字數 1849 閱讀 2481

delphi 泛型使用很是折騰,和c++的差得太遠。特別是類模板的使用,建立很是麻煩,還好可以變通的寫出來。

以下舉個例子,如何使用類模板。

unit test1;

inte***ce

uses

winapi.windows, winapi.messages, system.sysutils, system.variants, system.classes, vcl.graphics, vcl.controls, vcl.forms,

vcl.dialogs, generics.collections, vcl.stdctrls, vcl.buttons;

type

tform4 = class(tform)

btn1: tbitbtn;

procedure btn1click(sender: tobject);

private

public

end;

tvalue = class //基類

public

function name: string; virtual; //虛方法

end;

tvalue1= class(tvalue)

public

function name: string; override; //覆蓋基類虛方法

end;

ttest = class

public

procedure method; //測試方法1,用基類做模板型別,可以傳入任意子類

procedure method2; //測試方法2,用class關鍵字,可以傳入任意類

end;

var form4: tform4;

implementation

function tvalue.name: string;

begin

result:= 'value_base';

end;

function tvalue1.name: string;

begin

result:= '1_' + inherited name; //'value_1';

end;

procedure ttest.method2;

var value: t;

begin

value:= t(tclass(t).create); //用tclass把型別強轉,然後才能呼叫到create方法,

//最後用t強轉回來,是不是很折騰,而不能直接寫t.create ???

showmessage((value as tvalue).name); //這裡用as強轉為某個類,才能呼叫到類的方法

value.free;

end;

procedure ttest.method;

var value: t;

begin

value:= t(tclass(t).create);

showmessage(value.name); //這裡由於有型別定義,可以直接呼叫,不用as強轉

value.free;

end;

procedure tform4.btn1click(sender: tobject);

var t1: ttest;

begin

t1:= ttest.create;

t1.method; //value_base

t1.method; //1_value_base

t1.method; //value_base

t1.method2; //1_value_base

end;

泛型之泛型類

public class a 構造引數型別上使用泛型 public a t t 方法返回值上使用泛型 public t gett 方法的引數上使用泛型 這是泛型類的方法,而不是泛型方法 public void sett t t 方法的返回值和引數型別上使用泛型 public t foo t t pu...

泛型之泛型類

public class a 構造引數型別上使用泛型 public a t t 方法返回值上使用泛型 public t gett 方法的引數上使用泛型 這是泛型類的方法,而不是泛型方法 public void sett t t 方法的返回值和引數型別上使用泛型 public t foo t t pu...

泛型之泛型類

public class a 構造引數型別上使用泛型 public a t t 方法返回值上使用泛型 public t gett 方法的引數上使用泛型 這是泛型類的方法,而不是泛型方法 public void sett t t 方法的返回值和引數型別上使用泛型 public t foo t t pu...