我们可以通过ClassRegistry单元的TClassRegistry类很轻松的根据字符串创建出对象。

下面是该类几个主要函数的说明:


// 获取TClassRegistry自身的单例引用
class function GetClassRegistry: TClassRegistry;
// 注册需要动态创建的类
procedure RegisterClass(ClassName: UnicodeString; ObjectClass: TClass); overload;
// 判断给定的类名是否注册
function HasClass(ClassName: UnicodeString): Boolean;
// 根据类名创建对象实例
function CreateInstance(ClassName: UnicodeString): TObject;
 
当使用工厂模式或者抽象工厂模式创建产品的时候,如果我们要扩展新的具体产品,在创建方法中添加分支结构

需要改动原有的工厂类。如果能够根据字符串实现动态创建那么只要添加新的具体产品单元就可以了。

以下是一个用delphi简单实现的Demo:

UnitCar单元代码:

Delphi 根据字符串创建对象 - mopishv0 - MopishCrajorV0
1unit UnitCar;
interface
type TCar = class abstract
function Run: string; virtual; abstract;
end; TRedCar = class(TCar)
function Run: string; override;
end; TBlueCar = class(TCar)
function Run: string; override;
end; TBlackCar = class(TCar)
function Run: string; override;
end;
implementation
uses
ClassRegistry; { TBlackCar }
function TBlackCar.Run: string;
31begin
Result := 'BlackCar Ready to run!'end; { TBlueCar }
function TBlueCar.Run: string;
38begin
Result := 'BlueCar Ready to run!'end; { TRedCar }
function TRedCar.Run: string;
45begin
Result := 'RedCar Ready to run!'end;
initialization
TClassRegistry.GetClassRegistry.RegisterClass(TRedCar.ClassName, TRedCar);
TClassRegistry.GetClassRegistry.RegisterClass(TBlueCar.ClassName, TBlueCar);
TClassRegistry.GetClassRegistry.RegisterClass(TBlackCar.ClassName, TBlackCar);
53end. 在这里我们声明了一个抽象的基类TCar和继承自TCar的三个具体的类。 在单元初始化处用RegisterClass方法注册了这三个子类。 UnitMain调用处代码: Delphi 根据字符串创建对象 - mopishv0 - MopishCrajorV0
1procedure TDemoForm.CreateClick(Sender: TObject);
2var
ClassRegistry: TClassRegistry;
Car: TCar;
5begin
ClassRegistry := TClassRegistry.GetClassRegistry;
if ClassRegistry.HasClass(Name.Text) then
begin
Car := ClassRegistry.CreateInstance(Name.Text) as TCar;
Memo.Lines.Add(Car.Run);
Car.Free;
end else
Memo.Lines.Add(Format('Class %s has not registerd!', [Name.Text]));
14end;

如果我们需要扩展个TYellowCar那么我们只要添加个继承自TCar的TYellowCar类并且注册该类就可以了。

Delphi根据字符串实例化对象的更多相关文章

  1. Delphi 通过字符串实例化类

    通过字符串创建窗体类对象 1.需要在程序初始化的时候将类注册,注册到对象 RegGroups:(TRegGroups)中,以便查找. 注册类使用的函数:RegisterClass ,窗体初始化操作放在 ...

  2. 用TypeScript开发Vue——如何通过vue实例化对象访问实际ViewModel对象

    用TypeScript开发Vue--如何通过vue实例化对象访问实际ViewModel对象 背景 我个人很喜欢TypeScript也很喜欢Vue,但在两者共同使用的时候遇到一个问题. Vue的实例化对 ...

  3. PHP面向对象(OOP)编程入门教程————如何实例化对象?

    我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实例化对象了. 当定义好类后,我们使用new关键字来生成一个对象. $对象名称 = new 类名称 ...

  4. 模拟new实例化对象。

    使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...

  5. 一篇文章看懂java反射机制(反射实例化对象-反射获得构造方法,获得普通方法,获得字段属性)

    Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到C ...

  6. C++和JAVA实例化对象的区别

    JAVA: A a = new A(); 为A对象创建了一个实例,但在内存中开辟了两块空间:一块空间在堆区,存放new A()这个对象:另一块空间在堆栈,也就是栈,存放a,a的值为new A()这个对 ...

  7. 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性

    大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...

  8. PHP中国际化的字符串比较对象

    在 PHP 中,国际化的功能非常丰富,包括很多我们可能都不知道的东西其实都非常有用,比如说今天要介绍的这一系列的字符排序和比较的功能. 排序 正常来说,如果我们对数组中的字符进行排序,按照的是字符的 ...

  9. [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...

随机推荐

  1. 【BZOJ3052】【UOJ#58】【WC2013】糖果公园(树上莫队)

    [BZOJ3052][UOJ#58][WC2013]糖果公园(树上莫队) 题面 UOJ 洛谷 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引 ...

  2. 洛谷P1602 Sramoc问题 题解报告【同余+bfs】

    题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...

  3. Java之基础20160806

    注意这里介绍的JAVA基础是指你对C语言已经比较熟练或者有一定基础了,再学习如下这知识就会比较快. 1.JAVA也是从MAIN开始执行,但是要先定义类,文件名要与类名一致并且类名首字母要大写,同时JA ...

  4. pasty公式

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  5. windows下MySQL 5.7+ 解压缩版安装配置方法--转载

    方法来自伟大的互联网. 1.去官网下载https://dev.mysql.com/downloads/mysql/.zip格式的MySQL Server的压缩包,根据需要选择x86或x64版.注意:下 ...

  6. Python urllib urlretrieve函数解析

    Python urllib urlretrieve函数解析 利用urllib.request.urlretrieve函数下载文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Ur ...

  7. 【BZOJ4870】组合数问题(计数DP,快速幂)

    题意: 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 思路:From http://blog.csdn.net/qq_33229466/artic ...

  8. 【CodeForces】889 C. Maximum Element 排列组合+动态规划

    [题目]C. Maximum Element [题意]给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[ ...

  9. 一般处理程序、ASP.NET核心知识(5)

    初窥 1.新建一个一般处理程序 新建一个一般处理程序 2.看看里头的代码 public class MyHandler : IHttpHandler { public void ProcessRequ ...

  10. [HDU1205]吃糖果 题解(鸽巢原理)

    [HDU1205]吃糖果 Description -HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次 ...