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.

http://www.cnblogs.com/gxch/archive/2011/04/23/GetClass.html

时间: 2024-08-27 00:28:34

GetClass与RegisterClass的应用一例的相关文章

小怪兽 Java反射技术 等你来打

Java反射技术,是java的难点,也是程序员进化过程中的必打小怪兽,这里就根据java api好好研究一下java的反射技术. Class Fields Methods 请先回忆一下[java类的定义]. 一.反射是什么 反射是什么?百度百科这样定义:JAVA反射机制是在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取对象信息以及动态调用对象方法的功能称为java语言的反射机制. 可以这样理解,大家小时候有木有玩过平

Scala--第八天

一.option类型 定义:通过该类型可以有效的避免空指针异常 1 def func(a: Double, b: Double): Option[Double] = { 2 if (b != 0) { 3 //没错的情况下 返回值用Some函数包起来 4 Some(a / b) 5 } else { 6 //无值 返回None 7 None 8 } 9 } 10 11 def main(args: Array[String]): Unit = { 12 var a = func(2.0, 2.0

有意思的RegisterClass

例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常良好的Delphi程序!恭喜你,你已经可以进行程序开发这个伟大的事业了.不过,当你学了一段时间后也许就不这么想了哦.因为Delphi是支持面向对象的语言,其实所有的VCL Component都是基于面向对象的语言设计的,那么当我们用这些面向对象的东东来设计出一些不怎么面向对象的东东好象有些不伦不类的

单例 (JAVA)

java中单例模式是一种常见的设计模式,以下是它的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例 第一种(懒汉,线程不安全): 1 public class Singleton {   2     private static Singleton instance;   3 private Singleton (){}    4     public static Singleton getInstance() {   5     if 

第79讲:单例深入讲解及单例背后的链式表达式

今天我们来看一下scala中的单例及单例的链式表达式 让我们通过代码进行分析. object Scalaclass Java1class JVM{def method1:this.type=this}class JVM_Language extends JVM{def method2:this.type=this}object Singleton_type{def main(args:Array[String]){println(Scala.getClass)println(typeOf[Sca

ADF Faces 表格应用基础案例二:动态字段+事件处理【附样例工程】

本文提供一个基于ADF Face组件开发样例工程,实现表格开发中常见的处理: 1.Map对象+Bean对象填充表格的数据行. 2.使用静态列.动态列.嵌套列的实现方法. 3.介绍表格中表单组件的使用方法. 4.介绍表格单行选中事件的处理过程. 本文是基于"ADF Faces 表格应用基础案例一:应用List<Class>填充文本表格"编写的,会省去许多细节部分的介绍. 实现的基本思路: 将样例工程的创建过程分为几个小的阶段,每个阶段实现了不同的目标. 第一阶段: 表格数据:

单例模式序列化后反序列化单例失效的问题

不做处理的情况下,单例模式失效,代码如下: public class User implements Serializable { public String getName() { return name; } public void setName(String name) { this.name = name; } public static final User INSTANCE= new User(); private String name ; // private Object r

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

单例设计模式-java

第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstance() { 6 if (instance == null) { 7 instance = new Singleton(); 8 } 9 return instance; 10 } 11 } 这种写法lazy load