我们可以通过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. Codeforces711

    A ZS the Coder and Chris the Baboon are travelling to Udayland! To get there, they have to get on th ...

  2. 【CF625E】Frog Fights(模拟)

    [CF625E]Frog Fights(模拟) 题面 CF 洛谷 翻译: 有\(n\)只青蛙在一个被分为了\(m\)等分的圆上,对于每份顺时针依次标号. 初始时每只青蛙所在的位置是\(p_i\),速度 ...

  3. LCA的倍增算法

    LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...

  4. CF1100E

    i207M给的题 省选前-小题解合集 给定一张有向图,每条边有边权.你可以花费边权的代价反转一条边,使得原图中没有环.最小化反转的边权的最大值. 首先二分,然后考虑判定. 转化为有些边可以翻转,有些边 ...

  5. 【bzoj2707】走迷宫

    Portal --> bzoj2707 Solution 首先题目有一个十分明显的暗示..强联通分量..那肯定就是要tarjan一波咯 先看看什么情况下会\(INF\),其实就是题目里面讲的两种 ...

  6. (二)SMO算法

    11 SMO优化算法(Sequential minimal optimization) SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规 ...

  7. python之numpy矩阵库的使用(续)

    本文是对我原先写的python常用序列list.tuples及矩阵库numpy的使用中的numpy矩阵库的使用的补充.结合我个人现在对线性代数的复习进度来不断更博. Section 1:行列式的计算 ...

  8. python函数的输入参数

    http://note.youdao.com/noteshare?id=c2a0a39ee3cae09a62dcbc9f96d04b56

  9. crontab 自动执行脚本

    crontab -e ================>自动执行某脚本!!!!!!! 1001 ls 1002 cd /home/wwwroot/default/ 1003 ls 1004 cr ...

  10. packet32 -- 打印packet32捕获的包

    void PrintPackets(LPPACKET lpPacket) { ULONG i, j, ulLines, ulen, ulBytesReceived; char *pChar, *pLi ...