zoukankan      html  css  js  c++  java
  • GETCLASS与REGISTERCLASS的应用一例

    利用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.
  • 相关阅读:
    POJ 1113 Wall
    POJ 2159 Ancient Cipher
    POJ 3253 Fence Repair
    HDU 5444 Elven Postman
    HDU 5432 Pyramid Split
    数据库 组合查询
    数据库 简单的数据查询
    数据库 聚合函数与分组
    数据库 使用DML语句更改数据
    数据库的数据完整性
  • 原文地址:https://www.cnblogs.com/del88/p/6364977.html
Copyright © 2011-2022 走看看