利用GetClass与RegisterClass可以实现根据字符串来实例化具体的子类,这对于某些需要动态配置程序的场合是很有用的。其他的应用如子窗体切换,算法替换等都能得到应用。
unit Example1;
![](/Images/OutliningIndicators/None.gif)
interface
![](/Images/OutliningIndicators/None.gif)
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
![](/Images/OutliningIndicators/None.gif)
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
![](/Images/OutliningIndicators/None.gif)
ILog = interface(IUnknown)
['{A65044FC-644C-482A-BBFF-50A618835FC6}']
procedure WriteMessage;
end;
![](/Images/OutliningIndicators/None.gif)
TLog = class(TInterfacedPersistent, ILog)
public
class function CreateInstance(Name: string): TLog; overload;
procedure WriteMessage; virtual; abstract;
end;
![](/Images/OutliningIndicators/None.gif)
TTextLog = class(TLog)
public
procedure WriteMessage; override;
end;
![](/Images/OutliningIndicators/None.gif)
TXMLLog = class(TLog)
public
procedure WriteMessage; override;
end;
![](/Images/OutliningIndicators/None.gif)
TNullLog = class(TLog)
public
procedure WriteMessage; override;
end;
![](/Images/OutliningIndicators/None.gif)
var
Form1: TForm1;
![](/Images/OutliningIndicators/None.gif)
implementation
![](/Images/OutliningIndicators/None.gif)
{$R *.dfm}
![](/Images/OutliningIndicators/None.gif)
procedure TForm1.Button1Click(Sender: TObject);
var
Log: TLog;
begin
{ 实际应用中可以从配置中读取字符串来决定实例化具体的子类 }
Log := TLog.CreateInstance('TXMLLog');
if Assigned(Log) then
begin
Log.WriteMessage;
Log.Free;
end;
end;
![](/Images/OutliningIndicators/None.gif)
class function TLog.CreateInstance(Name: string): TLog;
var
AClass: TPersistentClass;
begin
Result := nil;
AClass := GetClass(Name);
if Assigned(AClass) then
begin
Result := AClass.NewInstance as TLog;
Result.Create;
end
else
{ error handle }
end;
![](/Images/OutliningIndicators/None.gif)
{ TTextLog }
![](/Images/OutliningIndicators/None.gif)
procedure TTextLog.WriteMessage;
begin
//写入到文本文件
end;
![](/Images/OutliningIndicators/None.gif)
{ TXMLLog }
![](/Images/OutliningIndicators/None.gif)
procedure TXMLLog.WriteMessage;
begin
//写入到XML文件
end;
![](/Images/OutliningIndicators/None.gif)
{ TNullLog }
![](/Images/OutliningIndicators/None.gif)
procedure TNullLog.WriteMessage;
begin
{ nothing need to do }
end;
![](/Images/OutliningIndicators/None.gif)
initialization
RegisterClass(TTextLog);
RegisterClass(TXMLLog);
RegisterClass(TNullLog);
![](/Images/OutliningIndicators/None.gif)
finalization
UnRegisterClass(TTextLog);
UnRegisterClass(TXMLLog);
UnRegisterClass(TNullLog);
![](/Images/OutliningIndicators/None.gif)
end.