我知道用所谓的反射可以实现,但目前我掌握的方法是使用System.Type,不能利用编译期类型检查,
就是说如果类型错误,运行期才可发现。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end; TClassParentClass = class of TClassParent; TClassParent = class
public
function getValue: string;virtual;abstract;
end; TClassChild1 = class(TClassParent)
public
function getValue: string;override;
end; TClassGrandson1 = class(TClassChild1)
public
function getValue: string;override;
end; TClassChild2 = class(TClassParent)
public
function getValue: string;override;
end;var
Form1: TForm1;implementation{$R *.dfm}
function TClassChild1.getValue:string;
begin
result := 'This is TClassChild1.';
end;function TClassGrandson1.getValue: string;
begin
result := 'This is TClassGrandson1.';
end;function TClassChild2.getValue:string;
begin
result := 'This is TClassChild2.';
end;type
TArrayOfParent = array of TClassParent;///////////////////////////////////////////////////////////////////////////
//这里
function CreateObjects(const aClassArray : array of TClassParentClass) : TArrayOfParent;
var
len, i : integer;
begin
result := nil;
len := Length(aClassArray);
if len = 0 then
exit; SetLength(result, len); for i := Low(aClassArray) to High(aClassArray) do
begin
result[i - Low(aClassArray)] := aClassArray[i].Create;
end;
end;
///////////////////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
res : TArrayOfParent;
i : integer;
begin
///////////////////////////////////////////////////////////////////////////
//这里调用
res := CreateObjects([TClassChild1, TClassChild2, TClassGrandson1]);
for i := Low(res) to High(res) do
begin
try
ShowMessage(res[i].getValue);
finally
res[i].free;
end;
end;
end;end.
就是说如果类型错误,运行期才可发现。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end; TClassParentClass = class of TClassParent; TClassParent = class
public
function getValue: string;virtual;abstract;
end; TClassChild1 = class(TClassParent)
public
function getValue: string;override;
end; TClassGrandson1 = class(TClassChild1)
public
function getValue: string;override;
end; TClassChild2 = class(TClassParent)
public
function getValue: string;override;
end;var
Form1: TForm1;implementation{$R *.dfm}
function TClassChild1.getValue:string;
begin
result := 'This is TClassChild1.';
end;function TClassGrandson1.getValue: string;
begin
result := 'This is TClassGrandson1.';
end;function TClassChild2.getValue:string;
begin
result := 'This is TClassChild2.';
end;type
TArrayOfParent = array of TClassParent;///////////////////////////////////////////////////////////////////////////
//这里
function CreateObjects(const aClassArray : array of TClassParentClass) : TArrayOfParent;
var
len, i : integer;
begin
result := nil;
len := Length(aClassArray);
if len = 0 then
exit; SetLength(result, len); for i := Low(aClassArray) to High(aClassArray) do
begin
result[i - Low(aClassArray)] := aClassArray[i].Create;
end;
end;
///////////////////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
res : TArrayOfParent;
i : integer;
begin
///////////////////////////////////////////////////////////////////////////
//这里调用
res := CreateObjects([TClassChild1, TClassChild2, TClassGrandson1]);
for i := Low(res) to High(res) do
begin
try
ShowMessage(res[i].getValue);
finally
res[i].free;
end;
end;
end;end.
通常C#中使用成员函数GetType来得到他所对应的System.Type类型。
就是说,无法利用编译期类型检查了?
能否给个例子?谢了先。
object o=System.Activator.CreateInstance(typeof(Form));
(o as Form).ShowDialog();
Form func(Type v)
{
return System.Activator.CreateInstance(v) as form;
}若
Form form = func(typeof(ArrayList));则编译期无法发现错误,仅在运行期引发异常。
有没有类似delphi的实现方式?