当前位置: 首页 > news >正文

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)

14.2.5 泛型类的类构造函数

​ 当您为泛型类定义构造函数时,会出现一个非常有趣的情况。实际上,编译器会生成一个这样的构造函数,并为每个泛型类实例调用这个构造函数,即为使用泛型模板定义每个实际类型。这非常有趣,因为如果没有构造函数,在您的程序中要创建的每个泛型类的实例,要执行初始化代码将非常复杂。

​ 例如,考虑一个具有一些类类型数据的泛型类。每个泛型类的实例也会获得这种类类型数据的实例。如果您需要为类类型数据分配初始值,则无法使用Unit初始化代码,因为在定义泛型类的单元中,您不知道将需要哪些实际类。

​ 以下是一个泛型类的示例,其中使用类构造函数初始化DataSize类字段,该示例摘自GenericClassCtor示例:

typeTGenericWithClassCtor<T> = classprivateFData: T;procedure SetData(const Value: T);publicclass constructor Create;property Data: T read FData write SetData;class varDataSize: Integer;end;

​ 这是泛型类构造函数的代码,它使用内部字符串列表(有关实现细节,请参见完整源代码)来跟踪实际调用的类构造函数:

class constructor TGenericWithClassCtor<T>.Create;
beginDataSize := SizeOf(T);ListSequence.Add(ClassName);
end;

​ 演示程序创建并使用了一对泛型类实例,并声明了第三个泛型类的数据类型,该数据类型由链接器删除:

varGenInt: TGenericWithClassCtor<SmallInt>;GenStr: TGenericWithClassCtor<string>;
typeTGenDouble = TGenericWithClassCtor<Double>;

​ 如果您要求程序显示ListSequence字符串列表的内容,您将只会看到实际初始化的类型:

TGenericWithClassCtor<System.SmallInt>
TGenericWithClassCtor<System.string>

​ 但是,如果您在不同的单元中基于相同的数据类型创建泛型实例,则链接器可能无法按预期工作,并且您将拥有多个相同类型的泛型类构造函数。

注解:解决这个问题并不容易。为了避免重复初始化,您可能需要检查类构造函数是否已执行。然而,总的来说,这个问题是泛型类的更全面限制的一部分,而链接器无法对其进行优化。

​ 在这个示例的第二个单元中,我添加了一个名为Useless的过程,当取消注释时,它将突出显示该问题,并显示以下初始化序列:

TGenericWithClassCtor<System.string>
TGenericWithClassCtor<System.SmallInt>
TGenericWithClassCtor<System.string>

相关文章:

  • 「C系列」C enum(枚举)
  • go-zero整合Excelize并实现Excel导入导出
  • pytest+requests+allure自动化测试接入Jenkins学习
  • uniapp地图选择位置
  • docker部署redis实践
  • `kubectl get pod -oyaml` 和 `kubectl describe pod`
  • C#面:什么是 Windows 服务,它的生命周期与标准的 EXE 程序有什么不同
  • 【2024算力大会分会 | SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)
  • Pydantic的BaseConfig
  • 一款优秀的下载和共享工具
  • 数值计算精度问题(浮点型和双整型累加精度测试)
  • 机器学习专题记录
  • 机器学习作业6——svm支持向量机
  • 探索AOSP中的RRO:运行时资源覆盖的奥秘
  • tmux 移植到ARM板端运行环境搭建
  • 网络传输文件的问题
  • CSS实用技巧
  • HTML-表单
  • Intervention/image 图片处理扩展包的安装和使用
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaScript新鲜事·第5期
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Redux系列x:源码分析
  • SegmentFault 2015 Top Rank
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Terraform入门 - 1. 安装Terraform
  • Xmanager 远程桌面 CentOS 7
  • 硬币翻转问题,区间操作
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 在weex里面使用chart图表
  • 怎么把视频里的音乐提取出来
  • 第二十章:异步和文件I/O.(二十三)
  • 选择阿里云数据库HBase版十大理由
  • ​Linux·i2c驱动架构​
  • ​Spring Boot 分片上传文件
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define、const、typedef的差别
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (译) 函数式 JS #1:简介
  • (转)EOS中账户、钱包和密钥的关系
  • (转)shell调试方法
  • (转)程序员技术练级攻略
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 使用配置文件
  • .net 中viewstate的原理和使用
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证