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. GetClass与RegisterClass的应用一例的更多相关文章
- Ioc容器依赖注入-Spring 源码系列(2)
Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...
- 学习 Spring (十) 注解之 @Bean, @ImportResource, @Value
Spring入门篇 学习笔记 @Bean @Bean 标识一个用于配置和初始化一个由 Spring IoC 容器管理的新对象的方法,类似于 XML 配置文件的 可以在 Spring 的 @Config ...
- Java之旅(1)—Class类
看到Class的时候,我们是不是会一下子想到我们敲代码中的class呢?此Class非彼class,这里讲的Class类实际上就是java类的统称,我们能够将其称之为抽象的类不是详细的一个类的名字. ...
- Java查漏补缺(3)(面向对象相关)
Java查漏补缺(3) 继承·抽象类·接口·静态·权限 相关 this与super关键字 this的作用: 调用成员变量(可以用来区分局部变量和成员变量) 调用本类其他成员方法 调用构造方法(需要在方 ...
- Spring源码系列(二)--bean组件的源码分析
简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文 ...
- 有意思的RTL函数RegisterClass(在持久化中,你生成的一个新类的对象,系统并不知道他是如何来的,因此需要你注册)good
例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常 ...
- Java-单例模式(singleton)-转载
概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...
- 单例 (JAVA)
java中单例模式是一种常见的设计模式,以下是它的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例 第一种(懒汉,线程不安全): 1 publ ...
- Scala 深入浅出实战经典 第79讲:单例深入讲解及单例背后的链式表达式
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
随机推荐
- 大数据-06-Spark之读写Hive数据
简介 Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据.Hive本身不存储数据,它完全依赖HDFS和MapReduce.这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询 ...
- 第一篇 make与makefile介绍
我们在Linux系统中学习C语言或者C++语言时,大多数时候只是用gcc命令或者g++命令在命令行进行简单的编译.链接即可得到最终的可执行文件,进一步即可验证所写C/C++语言的正确性.但是,在大型工 ...
- threejs绘制顺序
renderer.sortObjects = false; 然后,scene.add(),就可以先add先画了,否则add的顺序和渲染出来的顺序不一定一致.
- JAVA基础部分复习(三、泛型)
JAVA泛型的基本使用: /** * JAVA泛型的使用 * 定义:泛型的本质是参数化类型,就是说所操作的数据类型被指定为一个参数. * * 定义泛型方法的规则 * 1.所有泛型方法声明都有一个类型参 ...
- Gym - 101002K:YATP (树分治+二分+斜率优化)
题意:给定带点权边权的树,定义路径的花费=路径边权和e+起点点权w[s]*终点点权w[t].N<2e5,e,w<1e6: 思路:首先,需要树分治. 然后得到方程dp[i]=min{ dis ...
- codefoce Cooking Time
#include <bits/stdc++.h> using namespace std; struct T { // 贪心 优先弹出相邻靠后的材料 int id; int p; bool ...
- Beta周第7次Scrum会议(11/16)【王者荣耀交流协会】
一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/16 17:03~17:17,总计14min. ...
- {"errcode":48001,"errmsg":"api unauthorized}
微信公众号基础知识说明 网页授权获取微信用户信息:两种 scope 域 https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&am ...
- 2018.4.24 java实现8皇后算法
import java.util.Scanner; public class Nqueens { private boolean verify(int[] arr,int i) { // TODO A ...
- C++学习(一)之Visual Studio安装以及首次使用
一.安装Visual Studio 首先下载Visual Studio 链接: http://pan.baidu.com/s/1pLhJt0Z 密码:uqyc 将.ios文件解压得到以下文件: 点击v ...