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

14.2.5 泛型类的类构造函数

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

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

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

type
    TGenericWithClassCtor<T> = class
    private
        FData: T;
    	procedure SetData(const Value: T);
    public
        class constructor Create;
        property Data: T read FData write SetData;
        class var
        	DataSize: Integer;
    end;

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

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

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

var
    GenInt: TGenericWithClassCtor<SmallInt>;
    GenStr: TGenericWithClassCtor<string>;
type
	TGenDouble = TGenericWithClassCtor<Double>;

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700878.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QWidget 属性——windowTitle·windowIcon·qrc

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…

金融科技企业如何提高服务效率

一、引言 在金融科技&#xff08;FinTech&#xff09;领域&#xff0c;服务效率是企业竞争力的重要组成部分。随着科技的不断进步和市场竞争的加剧&#xff0c;金融科技企业必须不断提升服务效率&#xff0c;以满足客户需求&#xff0c;赢得市场份额。本文将从多个角度详细阐述…

AB测试学习(附有相关代码)

目录 一、基本概念1. 定义2. 作用3. 原理 二、实验基本原则三、实验步骤四、实验步骤详解1. 确定实验目的2. 确定实验变量3. 实验指标设计3.1 实验指标类型&#xff08;按作用区分&#xff09;3.1.1 核心指标3.1.2 驱动指标&#xff08;跟踪指标&#xff09;3.1.3 护栏指标 3.2…

pycharm爬取BOSS直聘岗位信息

编译器&#xff1a;Pycharm 效果展示如图 简单原理描述&#xff1a;模拟人工动作爬取页面信息&#xff0c;运行脚本后代码自动打开浏览器获取相关信息&#xff0c;模拟人工进行页面跳转并自动抓取页面信息记录到表格中。 深入原理描述&#xff1a;页面翻转的时候会调用接口&am…

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一&#xff1a;完成合金弹头人物交互 例题二&#xff1a;反恐重击瞄准和弹痕 例题一代码&#xff1a; 例题二代码&#xff1a; 总结 前言 为了提高作…

【会议征稿,五大海内外高校支持】第四届经济发展与商业文化国际学术会议(ICEDBC2024,6月21-23)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在中国大连隆重召开。会议主要围绕“经济发展”“商业文化”等研究领域展开讨论。 旨在为经济&#xff0c;商业的专家学者及企业发展人提供一个分享研究成果、讨论存在的问题与挑战…

调整SinoDB数据库日志模式

在数据库上线后&#xff0c;可能需要变更数据库的日志模式&#xff0c;这可能是由于业务变更或性能调整等原因引起的。数据库日志模式的变更可能涉及单一实例环境或高可用集群环境。本文将介绍如何调整SinoDB数据库的日志模式。 1、 停止应用程序 在修改数据库日志模式之前&am…

Spring 中使用MyBatis

一、Mybatis 的作用 1、MyBatis&#xff08;前身为iBatis&#xff09;是一个开源的Java持久层框架&#xff0c;它主要用于与数据库交互&#xff0c;帮助开发者更轻松地进行数据库操作。 持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。 2、MyB…

【BIM+GIS】Supermap优化BIM模型

文章目录 一、生成缓存二、实例化一、生成缓存 第一步:导出Revit模型 第二步:加载模型 第三步:生成缓存 第四步:添加到场景 二、实例化 实例化技术适用于重复模型较多的情况,可以实现对相同的几何模型只绘制一次,降低了显卡等硬件设备的压力。例如,一幢房屋中存在大量…

C++ day6 练习

#include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){}virtual void perform(){cout << "我是" << name <<endl;} };class Lion:public Animal { private:string…

Deploy Kafka for Centos 7

应用介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写&#xff0c;用于处理消费者在网站中的所有动作流数据。 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据&#xff0c;这些数据…

filezilla-server 1.8.1 设置

filezilla-server 1.8.1 设置&#xff1a; 1. 2. 3. 4. 其他不用配置&#xff0c; 5. 6. 7. 8. 9. 如果外网连不上 filezilla-server 提示无法连接到服务器&#xff0c; 多半是 filezilla-server 所在的电脑没有通过防火墙允许&#xff0c;打开 Windows defender 防…

最短路径Dijkstra算法详解

目录 最短距离问题 最短路径问题 进阶--标尺增多 升级方法 例题应用 最短距离问题 Dijkstra算法的策略&#xff1a; 设置集合S存放已被访问的顶点&#xff0c;然后执行n次下面的两个步骤&#xff08;n为顶点个数&#xff09;&#xff1a; &#xff08;1&#xff09;每次…

c++中string用法详解

目录 二、案例需求 三、案例实现 1.首先获取strData中的角色数量 2.创造结构体数组&#xff0c;定义两个索引值 3.循环遍历对结构体User中的Id和Exp进行赋值 4.对结构体数组userArr进行排序 5.展示结果以及最终代码 ​四、最后 一、前言 在C中&#xff0c;std::string …

webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)

考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供&#xff0c;分别是24MHz的HSE、32.768KHz的LSE。原…

服务器制作RAID磁盘阵列并管理

1. 规划节点 主机规划 IP主机名节点192.168.100.10localhost控制节点 2. 基础准备 使用VMWare Workstation软件安装CentOS 7.2操作系统&#xff0c;镜像使用提供的 CentOS-7-x86_64-DVD-1511.iso&#xff0c;并添加4块20 GB硬盘。YUM源使用提供的 mdadm_yum文件夹。 1. 创…

R可视化:ggpubr包学习

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者 Xiao hong书&#xff1a;生信学习者 知hu&#xff1a;生信学习者 CDSN&#xff1a;生信学习者2 介绍 ggpubr是我经常会用到的R包&#xff0c;它傻瓜式的画图方式对很多初次接触R绘图的人来…

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码&#xff0c;喜欢的朋友可以下载研究 一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

什么是自适应滤波器?

一、自适应滤波器 自适应滤波器是一种能够自动调整其滤波参数以匹配输入信号特性变化的滤波器&#xff0c;主要用于信号处理中选择性地通过特定频率范围内的信号&#xff0c;同时抑制其他频率成分。自适应滤波器主要有几种&#xff1a; LMS (Least Mean Squares) 自适应滤波器…