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.
  • 相关阅读:
    Docker容器操作
    Docker的镜像操作
    CentOs安装Docker
    超长字符串
    编程之美-2.11 扩展 寻找距离最远的两个点
    编程之美-2.8 找到符合条件的整数
    编程之美-2.4 1的数目
    编程之美-1.16 24点游戏
    logistic回归 c++ 实现
    朴素贝页斯分类法 c++实现
  • 原文地址:https://www.cnblogs.com/del88/p/6364977.html
Copyright © 2011-2022 走看看