在面向对象语言中,用两种方法建立类的实例:静态建立和动态建立。静态建立就是在程序中显式地建立类的实例,如c1 = TClass1.Create()。而动态建立是在只知道类名的前题下建立类的实例。动态建立在实现上要比静态建立更灵活,因为动态建立无需引用被建立类,并且更容易实现如多态等面向对象特性。

一、    动态建立类的实例
在delphi中动态建立类的实例可分为4步。
1. 声明一个从TPersistent继承的类。因为在注册类时要求必须从TPersistent继承。
2. 注册类。可以使用RegisterClass等过程进行注册。
3. 验证类是否被注册(可选)。如果确定要建立的类已经注册了,可以省略此步。
4. 得到并建立类。可使用FindClass(classname)得到要建立的类,然后使用Create方法建立类的实例。
下面给出一个动态建立类实例的简单实现。
第一步的代码
TClass1 = class(TPersistent)
public
  function GetValue(): String;
end;

function TClass1.GetValue(): string;
begin
  result := 'hello world';
end;
第二步的代码
Initialization //可将这两行放在end.的前面
  RegisterClass(TClass1);
第三步和第四步的代码
procedure TForm1.Button1Click(Sender: TObject);
var
  class1: TClass1;
begin
  if GetClass('TClass1')<>nil then
  begin
    class1 := FindClass('TClass1').Create as TClass1;
    showmessage(class1.GetValue);
  end;
end;

在delphi 中不仅可以根据类名动态建立类的实例,而且在注册时可以给类起一个别名,在建立类的实例时即可以使用类名,也可以使用别名。如上述代码中 RegisterClass(TClass1);可改为RegisterClassAlias(TClass1, ‘class1’);。而FindClass(‘TClass1’)也可改为FindClass(‘class1’)。另外,如果注册的类比较多,也可使用RegisterClasses一次注册多个类。RegisterClasses的定义如下。
procedure RegisterClasses(AClasses: array of TPersistentClass);
首先声明一个TpersistentClass类型的数组,然后将要注册的类按顺序赋到这个数组中,最后调用RegisterClasses即可。

二、通过动态建立实现多态
多态在程序设计中是非常重要的概念之一。它主要是通过继承来实现的。简单地说,就是n个类从一个类继承或实现一个接口,这n个类继承父类的所有 virtual方法或实现父接口的所有方法,并做出不同的实现。这n个类的实现都不一样,而它们的调用确是一样的,即对于调用来说是透明的。
如果使用静态建立类实例的方法实现多态,当类很多时需要进行大量的判断。而使用动态建立类实例的方法只要将子类的类名或别名当做参数传入即可。下面举一个例子如何在delphi中利用动态建立类实例的方法实现多态。
  //定义父类
TClassParent = class(TPersistent)
  public
//这是一个抽象虚函数,相当于c++的纯虚函数
function Greet(name: string): string; virtual; abstract; 
end;
//定义两个子类
  TEnglish = class(TClassParent)
    function Greet(name: string): string; override;
  end;
  TChinese = class(TClassParent)
    function Greet(name: string): string; override;
  end;

//实现两个子类的Greet函数
{ TClassEnglish }
function TEnglish.Greet(name: string): string;
begin
  result := 'hello ' + name;  //返回英文的问候
end;
{ TClassChinese }
function TChinese.Greet(name: string): string;
begin
  result := '您好 ' + name;  //返回中文的问候
end;

//注册两个子类
initialization
  RegisterClassAlias(TEnglish, 'eng');
  RegisterClassAlias(TChinese, 'chn');

//根据用户的选择建立类的实例
procedure TForm1.Button2Click(Sender: TObject);
var
  parent: TClassParent;
begin   
  if GetClass(combobox1.Items[combobox1.itemindex])<>nil then
  begin
//此处FindClass的参数可以是类名,也可以是别名
//本例中将类名放入了combobox中
    parent :=  FindClass(combobox1.Items[combobox1.itemindex]).Create as TClassParent;
    showmessage(parent.Greet('bill gates'));
  end;
end;
 
程序界面

在delphi中如何动态建立类的实例相关推荐

  1. 构造方法与重载:定义一个网络用户类,信息有用户 ID、用户密码、 email 地址。在建立类的实例时把以上三个信息都作为构造函数的参数输入

    构造方法与重载:定义一个网络用户类,信息有用户 ID.用户密码. email 地址.在建立类的实例时把以上三个信息都作为构造函数的参数输入, 其中用户 ID 和用户密码时必须缺省时 email地址是用 ...

  2. C# Activator的使用(类工厂动态创建类的实例)

    包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用.此类不能被继承--c# Activator c#在类工厂中动态创建类的实例 1. Activator.CreateInsta ...

  3. python 动态修改 类和实例 的方法

    相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法.比如说下面这个例子. class Dog:def bark(self):pri ...

  4. asp.net iframe html,ASP.NET中使用IFRAME建立类Modal窗口

    我们经常要在程序的人机交互中用到模态窗口,但在B/S开发中,这一切变得不容易了,虽然也可以用window.showModalDialog函数实现(见http://dotnet.aspx.cc/Show ...

  5. c#中代码中多线程动态创建progressbar的实例,概念很重要可扩展很多类似概念

    以下是代码中创建progressbar的实例 int count = 0;         private void button4_Click(object sender, EventArgs e) ...

  6. WPF中Brush的派生类,实例发光的小球

  7. delphi中的单元

    Object Passal的程序结构很特殊,与其它语言如C++,Object Windows等结构都不同.一个Delphi程序由多个称为单元的源代码模块组成.使用单元可以把一个大型程序分成多个逻辑相关 ...

  8. Java中通过代理对类进行修改

    JAVA中的静态代理.动态代理及JDK proxy和CGLIB.Javassist.ASM实践 简介 Java中对已经有的类进行修改,改变或调整其执行,这可以通过代理来实现.Java的class文件是 ...

  9. MFC动态建立二叉树、序列检错以及获取父节点

    根据前序+中序或中序+后序在MFC中实现动态建立二叉树. 文章目录 根据前序+中序或中序+后序在MFC中实现动态建立二叉树. 前言 一.动态建立二叉树 1.题目要求 2.具体实现 1.对话框布局 2. ...

最新文章

  1. matlab生成ai图片,MATLAB绘图:导出矢量图
  2. .Net魔法堂:史上最全的ActiveX开发教程——发布篇
  3. Ubuntu16.04LTS下搭建强化学习环境gym、tensorflow
  4. 2013.5.21号面试心得
  5. 三分钟掌握PHP操作数据库
  6. android 的各种文件类
  7. etl工程师 面试题_数据仓库工程师面试题笔试.doc
  8. 产业研发用房是什么意思_新型产业用地(M0)之政策分享篇
  9. OpenCV调整图像的亮度
  10. 无监督学习:Linear Dimension Reduction(线性降维)
  11. 斐讯手表怎么刷机华为系统_智能手表怎么刷机?
  12. Matlab中Simulink小白入门初学教程
  13. T6 v6.2puls1 安装了最新补丁之后采购发票结算之后入库单价税合计有1分差额
  14. 我爱淘冲刺阶段站立会议每天任务5
  15. vscode android调试,利用VSCode对react-native android项目进行调试时出现报错如何解决...
  16. 【愚公系列】2022年10月 使用win11系统自带远程桌面,远程控制VMware中Windows虚拟机系统
  17. 华为是怎样研发的(4)——器件选型
  18. 前端css样式及选择器
  19. 如何以厘米为单位精确设置Excel表格的行高列宽?
  20. C语言中的void和void指针-void*,及void指针做函数参数。

热门文章

  1. c语言程序设计电大形考作业答案,2016年电大-电大c语言程序设计形成性考核册答案(-).doc...
  2. [转载]虚拟机磁盘空间已满的发现和解决
  3. 360回归A股,周鸿祎来给BAT和小米添堵了
  4. css li 空隙问题
  5. zoj 1406 Jungle Roads
  6. 讓combobox也綁定數據表
  7. 诗与远方:无题(八十七)
  8. 诗与远方:无题(十二)
  9. eDiary电子日记本
  10. 制作一个状态栏中跑马灯效果_图标设计指南(3)——制作一个图标集所需全部信息(中)...