程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> GetClass與RegisterClass的應用一例

GetClass與RegisterClass的應用一例

編輯:Delphi

利用GetClass與RegisterClass可以實現根據字符串來實例化具體的子類,這對於某些需要動態配置程序的場合是很有用的。其他的應用如子窗體切換,算法替換等都能得到應用。

unit Example1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
 private
 public
 end;
 ILog = interface(IUnknown)
  ['{A65044FC-644C-482A-BBFF-50A618835FC6}']
  procedure WriteMessage;
 end;
 TLog = class(TInterfacedPersistent, ILog)
 public
  class function CreateInstance(Name: string): TLog; overload;
  procedure WriteMessage; virtual; abstract;
 end;
 TTextLog = class(TLog)
 public
  procedure WriteMessage; override;
 end;
 TXMLLog = class(TLog)
 public
  procedure WriteMessage; override;
 end;
 TNullLog = class(TLog)
 public
  procedure WriteMessage; override;
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
 Log: TLog;
begin
 { 實際應用中可以從配置中讀取字符串來決定實例化具體的子類 }
 Log := TLog.CreateInstance('TXMLLog');
 if Assigned(Log) then
 begin
  Log.WriteMessage;
  Log.Free;
 end;
end;
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;
{ TTextLog }
procedure TTextLog.WriteMessage;
begin
 //寫入到文本文件
end;
{ TXMLLog }
procedure TXMLLog.WriteMessage;
begin
 //寫入到XML文件
end;
{ TNullLog }
procedure TNullLog.WriteMessage;
begin
 { nothing need to do }
end;
initialization
 RegisterClass(TTextLog);
 RegisterClass(TXMLLog);
 RegisterClass(TNullLog);
finalization
 UnRegisterClass(TTextLog);
 UnRegisterClass(TXMLLog);
 UnRegisterClass(TNullLog);
end.


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved