• 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.
  • 相关阅读:
    wayland学习笔记(八) wayland为什么要用libffi
    线程安全函数和可重入函数 辨析
    patch的基本使用
    c++ condition_variable的wait 语法糖
    系统启动知识 说道说道(一) 冰山之下
    DDR 带宽计算公式
    wayland学习笔记(七)config的结构分析
    功耗管理篇
    operator=() 重载的问题
    ABC216
  • 原文地址:https://www.cnblogs.com/del88/p/6364977.html
Copyright © 2020-2023  润新知