Delphi 类引用 class of

RAD Studio 10.2.3 测试√


  • 对于这些关系,用我自己的理解,可以说成下面的关系:(不能肯定我理解是对的,也希望大佬可以指点指点)
  • TClassRef = class of TXiaoyin; 用我的话来解释就是 老父亲的孩子是老父亲的一部分
  • 好比:
    TXiaoYin 代表 某家庭中的老父亲【可以明确的知道老父亲是谁】
    TClassRef 代表 某家庭中老父亲的所有孩子【这是泛指不能确定,只知道是这个老父亲的孩子】
    TXiaoYin1 代表 某家庭中老父亲的第一个孩子【可以明确的知道这个孩子是谁】
    TXiaoYin2 代表 某家庭中老父亲的第二个孩子【可以明确的知道这个孩子是谁】
  • mGetClassName()相当于叫名字的机器【里面的参数是名字库的范围 – 老父亲的孩子(包含老父亲de名字)】

代码部分

  // TTest1 写不写都可以,不影响的
  TXiaoYin = class(TTest1)
  end;

  // 如果使用 TClassRef 作为参数,那么在使用方法或过程的时候只需要传入一个类,而不是实体【就是初始化后的】
  TClassRef = class of TXiaoyin;

  TXiaoYin1 = class(TXiaoYin)
  end;

  TXiaoYin2 = class(TXiaoYin)
  end;
procedure TForm_Class.Button_class_ofClick(Sender: TObject);
  procedure mGetClassName(AClass: TClassRef);
  begin
    Form_Class.Memo_Log.Lines.Add(AClass.ClassName);
  end;
begin
  mGetClassName(TXiaoYin);
  mGetClassName(TXiaoYin1);
  mGetClassName(TXiaoYin2);
end;

运行结果

在这里插入图片描述


一点点笔记,以便以后翻阅。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
内联函数(Inlining) D7中的inline关键字作为保留字并不会对编译器产生实际作用,在2009中此关键字起到内嵌到代码中起到实际作用。语法如下: function foo: Integer; inline; 内部函数/过程也可以使用,但在D2009测试版中,方法的内部函数使用inline后不认Self指针;的子过程/子函数,也可以使用inline关键字,但没有实际效果,且虚方法/继承方法(virtual/override)不能使用。 重载运算符(Operator Overloading) 可以重载部分运算符,如+、-、型转换等,在D2006只支持到record,但从2007开始支持到Class,以下示例修改自官网: TMyClass = class // Addition of two operands of type TMyClass class operator Add(a, b: TMyClass): TMyClass; // Subtraction of type TMyClass class operator Subtract(a, b: TMyClass): TMyclass; // Implicit conversion of an Integer to type TMyClass class operator Implicit(a: Integer): TMyClass; // Implicit conversion of TMyClass to Integer class operator Implicit(a: TMyClass): Integer; // Explicit conversion of a Double to TMyClass class operator Explicit(a: Double): TMyClass; end; class operator TMyClass.Add(a, b: TMyClass): TMyClass; begin //... end; var x, y: TMyClass begin x := 12; // Implicit conversion from an Integer y := x + x; // Calls TMyClass.Add(a, b: TMyClass): TMyClass end; 助手(Class Helpers) Helper是对原Class的扩展,是我们在不修改原的基础上增加方法,并加入原的空间中。在Delphi中,对对象的调用实际上采用了两个步骤,首先是把对象地址放入eax寄存器中,然后call方法,所以如果不使用继承增加数据的话,用父调用继承的方法是没问题的,所以其实这样的方法在D7中也可以使用,但却很麻烦。所以Class Helper起到的就是这个作用,在Class Helper中可以增加的就是与实例无关的内容,所以任何需要增加实例Size的活VMT的功能不能声明,例如变量、虚方法等,但只占用空间的没关系,如class var。在应用上我们可以通过这种方法方便的给VCL一控件加上某个属性。 TFoo = class helper for TControl private function GetA: Integer; public class var X: Integer; procedure MSG(var Message: TMessage); message WM_MYMESSAGE; procedure ProcFoo; property A: Integer read GetA; end; // ... procedure TForm1.Foofoo; begin ProcFoo; // TControl -> TWinControl -> TScrollingWinControl-> TCustomForm -> TForm -> TFrom1: Call TFoo.ProcFoo end; strict关键字(Keyword “strict”) 众所周知,在Delphi中,的private和protected域中的变量可以被同一单元中可以自由的被访问(Delphi没有“友元”的概念,但同一个unit中可以说自动友元化了),而并非是真正的私有或只能被继承访问。而strict关键字的作用就是使该内容变成严格OO意义上的private/protected作用域,这点没有什么多说的。语法: strict private // Blah... strict protected // Blah... 结构方法(Records with Methods) 也没什么特别的,就是和class差不多,就一个不用创建和销毁、不能继承、没有作用域之,很容易掌握,所以这里就不多介绍了。但是很有意思的是带参数的constructor可以通过编译,可能是为了初始化的方便吧。 抽象和固实(Abstract and Sealed Classes) 这两个概念在OO中也并不陌生,抽象是不应该创建实例的(但D2006起的编译器就不给检查,连个Warning都没有,这还有啥用啊 -.- ),而固实是不能被继承的。语法: TAnAbstractClass = class abstract // or (TParentClass) // Blah... end; TASealedClass = class sealed(TAnAbstractClass) // or empty // Blah... end; 常量、变量、属性与静态方法(Class const/var/property and Static Class Methods) 老的Delphi中只提供了方法,而没有提供变量、常量和属性,这真的是很不方便。这里先区分一下我所使用的Class)和对象(Object)即的实例(Instance of Class)。当在Delphi中声明一个的时候,这个是有实际地址的,该地址记录了许多的相关信息,比如实例的Size啊、虚方法信息啊一堆东西,而创建一个对象的时候则把实例化,在堆(Heap)中分配一块地址,包括内部数据和VMT之的东西。在调用实例的时候,首先要知道对象地址,然后才能访问内部变量和调用方法时使用Self指针即实例地址;而在调用方法的时候,eax中的并不是实例的地址而是的地址,然后再call方法,这时的Self指针并非实例地址而是地址。所以对于每一个和继承来说,包括它和它的继承的所有实例,变量、常量都是同一个,这样就存在了一个唯一的可供使用的变量或常量,方便同步并且不需要使用较多的内存(可以参考C#中的,不过C#中不允许从实例直接访问变量、常量、方法)。而静态方法则是在使用这个方法的时候不传入class地址,也就是说没有Self指针,这样的方法的访问开销要小于普通的方法;这自然也就意味着,该方法不能被继承(不能virtual/override)。另外,属性的get/set方法必须使用静态方法。 TFooClass = class private class procedure SetFoo(const Value: Integer); static; // A Static Class Method protected class var FX : Integer; // class var public const FC: Integer = 10; // class const class procedure VirtualProc; virtual; class property X: Integer read FX write FX; // class property class property Foo: Integer read FC write SetFoo; end; 内部型与嵌套Class Types and Nested Classes) 可以说现在的Class的域几乎相当于原来的整个unit,以前不能放里面的元素现在都可以放里面了,这个也没什么好多说的,试验一下就很容易明白了。 终方法(Final Methods) 这个也是建立在虚方法的基础上的,在override后使用final关键字,则表示该虚方法不能再被子继承下去了。 TAClass = class public procedure Foo; virtual; end; TFinalMethodClass = class(TAClass) public procedure Test; override; final; // A Final Method end; For-in循环(For-in Loop) 这个应该是受.Net影响吧,支持遍历一个数组或提供了GetEnumerator函数的。GetEnumerator要求返回一个的实例,该包含有Current属性和MoveNext方法。 procedure Foo(List: TStrings); i : Integer; lst : array[0..100]of Integer; s : string; begin for i in lst do ; for s in List do ; // Support of TStrings.GetEnumerator end;
### 回答1: Delphi中的DLL是一个动态链接库,其中包含了可以被其他程序调用的函数和过程。通过将以及的方法和属性导出为DLL可以实现的跨项目、跨语言使用和调用。 在Delphi中,我们可以使用关键字`export`来将的方法和属性导出到DLL中。通过使用`exports`关键字,我们可以定义需要导出的及其方法和属性。 在导出之前,首先应该将声明为一个动态链接库,即在声明前加上`{$M+}`,以便在DLL中正确地管理内存。 例如,我们可以定义一个Person,并将其导出为DLL: ```delphi {$M+} type TPerson = class private FName: string; FAge: Integer; public constructor Create; destructor Destroy; override; function GetName: string; procedure SetName(const AName: string); function GetAge: Integer; procedure SetAge(const AAge: Integer); end; var Person: TPerson; exports Person; implementation constructor TPerson.Create; begin inherited; FName := ''; FAge := 0; end; destructor TPerson.Destroy; begin // 清理资源 inherited; end; function TPerson.GetName: string; begin Result := FName; end; procedure TPerson.SetName(const AName: string); begin FName := AName; end; function TPerson.GetAge: Integer; begin Result := FAge; end; procedure TPerson.SetAge(const AAge: Integer); begin FAge := AAge; end; ``` 通过以上代码,我们定义了一个Person,并将其导出为DLL,可以在其他项目中通过导入DLL方式使用这个。 ### 回答2: Delphi是一种编程语言,可以编写动态链接库(DLL)。通过DLL,我们可以将Delphi中的(class)导出到其他应用程序中使用。 在Delphi中,要将导出为DLL的一部分,我们需要在的定义前使用关键字"export",然后在定义的末尾加上关键字"external"。通过这些关键字,我们可以将的特性导出为一组可重用的代码。 导出的可以被其他程序集调用,这意味着其他应用程序可以使用该的方法和属性。在其他应用程序中使用导出的时,需要引入导出的DLL并调用其中的实例。 由于DLL可以跨程序集使用,这种导出的方式可以方便地实现代码的模块化和复用。通过DLL,我们可以将具有通用功能的封装为独立的模块,然后在不同的应用程序中共享并重复使用。 使用Delphi编写DLL并导出的一个示例是创建一个计算器,可以执行各种数学运算。在DLL中导出的计算器将具有加法、减法、乘法和除法等方法,其他应用程序可以通过调用这些方法来进行相应的数学运算。 总之,Delphi支持将导出为DLL,通过这种方式可以实现代码的模块化和复用,使得其他应用程序可以方便地使用导出的的方法和属性。 ### 回答3: Delphi中的DLL导出Class)是指在DLL模块中导出一个或多个的功能。使用DLL可以将的功能封装在独立的模块中,其他应用程序可以通过调用DLL中的函数来使用这些功能,无需重新实现的代码。 在Delphi中,导出到DLL有以下几个步骤: 1. 创建一个新的DLL项目。在Delphi中,可以选择创建一个库项目,并将库型设置为"动态链接库",这样就可以编写DLL函数代码。 2. 定义要导出的。在DLL项目中,可以定义一个或多个,这些需要包含要导出的方法或属性。在声明前使用"{$ExportClass}"指令来标记要导出的。 3. 实现导出方法。在中实现需要导出的方法,并使用"{$ExportMethod}"指令来标记要导出的方法。在这些方法中可以包含需要调用的其他成员或库函数。 4. 编译DLL项目。在编译DLL项目时,Delphi会将导出的和方法生成对应的导出表。导出表中包含了和方法的地址,其他应用程序可以根据地址来调用DLL中的功能。 5. 在其他应用程序中调用DLL导出的。在其他应用程序中使用时,需要导入DLL并声明一个变量来引用导出的。通过调用变量的方法来使用DLL中的功能。 总的来说,使用Delphi创建DLL并导出需要定义要导出的和方法,编译生成DLL模块,其他应用程序通过导入DLL并调用导出的来使用其中的功能。这样可以实现模块化和代码复用,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小印丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值