我们可以通过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. Java进程配置文件Reload

    我们在开发Java程序的时候,很多常量信息都存在配置文件中,比如数据库连接信息.ip黑名单,事件的超时时间等等.当需要该这些配置的值时都需要重新启动进程,改动的配置才会生效,有时候线上的应用不能容忍这 ...

  2. SC命令(windows服务开启/禁用)

    原文链接地址:https://blog.csdn.net/cd520yy/article/details/30976131 sc.exe命令功能列表: 1.更改服务的启动状态(这是比较有用的一个功能) ...

  3. 手脱ACProtect v1.35(有Stolen Code)

    1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...

  4. git grep mysql 操作历史

    history |grep mysql-----git history匹配出mysql操作的命令 !626 到mysql命令安装处链接mysql /usr/local/mysql/bin/mysql ...

  5. google的几道面试题

    Question1:如何判断两个矩形是否有重叠区域? Answer(java): public boolean checkCross(Rectangle m, Rectangle n) { //求出m ...

  6. sql server常用函数、常用语句

    一.常用函数 1.字符串函数 : charindex(':','abc:123')    --寻找一个字符在一段字符串中起始的位置 len('zhangsan')   --获取一段字符串的长度 lef ...

  7. java多线程机制2(安全问题)

    线程状态图: ================================================================================= /* * 线程安全问题 ...

  8. Xcode变量概览-summary

    问题描述 在Xcode中断点调试时,鼠标停留在变量上,就能看到变量的信息.但对于自定义对象,通常Xcode提供的直接信息非常有限,像这样 想要了解这个对象具体的内容,需要展开左边的箭头 当开发者想要知 ...

  9. styled-components真的好吗?

    最近在学习react,然后遇到react中css该怎么写这个问题,上知乎上看了好多大牛都说styled-components好用是大势所趋. 但我自己用了感觉体验却很差,我在这里说说我为啥觉得styl ...

  10. 2008 Round 1A C Numbers (矩阵快速幂)

    题目描述: 请输出(3+√5)^n整数部分最后3位.如果结果不超过2位,请补足前导0. 分析: 我们最容易想到的方法肯定是直接计算这个表达式的值,但是这样的精度是不够的.朴素的算法没有办法得到答案.但 ...