拳击在实战中有用吗 Dll 中导出类 --Delphi 实战[1]
Dll 中导出类 --Delphi 实战[1]
从 Dll 中导出类 想必大家首先想到的是使用 bpl 包 这种方式有一个不好 那就是使用者必须清楚这个包中含有那些类 也就是说必须知道类的名字 这在一定意义上是个限制 试想一种情况 使用者定义了一个底层的抽象类 (abstract class) 然后在此基础上定义了许多应用类 (concrete class) 那么 对于使用者来说 他希望在不知道具体有哪些类的情况下能使用这些类 这么说似乎有些玄 但实际情况确实如此 因为定义抽象类的时候并不能预料到以后会有多少个具体类 那么这样的需求 要靠什么样的技术来实现呢?
其实实现的技术的难度并不大 作者在此将自己实践的经验献给大家 算作抛砖引玉 希望能看到其他更好的方法!
以下先介绍该方法涉及的一些基础知识 然后用一个例子来说明具体的实现
一 基本概念
元类 (meta class) 也叫类引用类型 (class reference type) 可以看成是一种类的类型 以该类型声明的变量的值代表一个类 比如 : type
TClass = Class of TObject;
这样就声明了一个元类的类型 然后可以有这样的变量声明 :
Var
AClass: TClass;
那么 就可以有这样的用法 :
AClass := TObject;或者 :
AClass := TButton;或者 :
AClass := TForm;等等
![拳击在实战中有用吗 Dll 中导出类 --Delphi 实战[1]](http://img.zhputi.com/uploads/84a6/84a6e5862fe70ee5e1b037da39735b6128945.jpg)
因为 TClass 是一个 TObject 类型的元类 而 TButton TForm 等都是自 TObject 派生而来 因而 TButton 和 TForm 这样的值对于 AClass 都是可接受的
然后 我们就可以运用多态的思想 灵活运用 AClass 这个类变量了 而这一点也正是下文具体实现的基础知识
二 具体实现
第一步 建立一个抽象类 :
我们使用这样一个简单的声明 该抽象类只提供了一种抽象方法 但并不影响我们描述问题 :
TMyBaseForm = Class(TForm)
protected
function GetTitle: pchar; virtual; abstract;
end;
MyBaseFormClass = Class of TMyBaseForm;
lishixinzhi/Article/program/Delphi/201311/24861