(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第3节(泛型约束)

14.3 泛型约束

​ 正如我们所看到的,您在泛型类的方法中可以做的事情非常少。您可以传递它(即分配它)并执行上面我介绍的泛型类型函数允许的有限操作。

​ 为了能够执行泛型类的实际操作,通常需要对其进行约束。例如,如果将泛型类型限制为类,则编译器将允许您在其上调用所有TObject方法。您还可以进一步限制类为给定层次结构的一部分,或实现特定接口,从而可以在泛型类型的实例上调用类或接口方法。

14.3.1 类约束

​ 您可以采用的最简单的约束是类约束。要使用它,您可以声明一个泛型类型,如下所示:

type
	TSampleClass<T: class> = class

​ 通过指定类约束,您表明只能将对象类型用作泛型类型。使用以下声明(取自ClassConstraint示例):

type
    TSampleClass<T: class> = class
    private
    	FData: T;
    public
        procedure One;
        function ReadT: T;
        procedure SetT(T1: T);
    end;

​ 您可以创建前两个实例,但不能创建第三个实例:

Sample1: TSampleClass<TButton>;
Sample2: TSampleClass<TStrings>;
Sample3: TSampleClass<Integer>; // Error

​ 对第三个声明,编译器产生的错误将是:

E2511 Type parameter 'T' must be a class type

​ 指定这种约束的优点是什么?在泛型类方法中,您现在可以调用任何TObject方法,包括虚方法!这是TSampleClass泛型类的One方法:

procedure TSampleClass<T>.One;
begin
    if Assigned(FData) then
    begin
        Form30.Show('ClassName: ' + FData.ClassName);
        Form30.Show('Size: ' + IntToStr(FData.InstanceSize));
        Form30.Show('ToString: ' + FData.ToString);
    end;
end;

注解 这里有两个注释。第一个是InstanceSize返回对象的实际大小,与我们之前使用的通用SizeOf函数不同,后者返回引用类型的大小。其次,请注意TObject类的ToString方法的使用。

​ 您可以运行程序以查看其实际效果,因为它定义并使用了一些泛型类型的实例,如以下代码片段所示:

var
	Sample1: TSampleClass<TButton>;
begin
    Sample1 := TSampleClass<TButton>.Create;
    try
        Sample1.SetT(Sender as TButton);
        Sample1.One;
    finally
    	Sample1.Free;
    end;

​ 请注意,通过声明一个带有自定义 ToString 方法的类,当数据对象是特定类型时,该版本将被调用,而不管提供的实际类型是什么。将在数据对象是特定类型时被调用,而不管提供给泛类型的实际类型是什么。换句话说,如果您有一个TButton后代,例如:

type
    TMyButton = class(TButton)
    public
    	function ToString: string; override;
    end;

​ 您可以将此对象作为TSampleClass<TButton>值传递,也可以定义特定的泛型类型实例,在这两种情况下,调用One方法最终会执行特定版本的ToString

var
Sample1: TSampleClass<TButton>;
Sample2: TSampleClass<TMyButton>;
Mb: TMyButton;
begin
...
Sample1.SetT(Mb);
Sample1.One;
Sample2.SetT(Mb);
Sample2.One;

​ 类似于类约束,您可以使用以下声明定义一个记录约束:

type
	TSampleRec<T: record> = class

​ 但是,不同的记录之间共同点很少(没有共同的祖先),因此这种声明有些受限。

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

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

相关文章

人工智能系统中毒是一个日益严重的威胁

咨询公司 Protiviti 最近与一家客户公司合作&#xff0c;该公司遭遇了一次不寻常的攻击&#xff1a;一名黑客试图操纵输入该公司人工智能系统的数据。 公司领导仍在调查此次攻击&#xff0c;公司怀疑黑客试图扭曲人工智能系统的输出。 此类攻击并非新鲜事&#xff0c;但在网络…

C语言详解(预编译)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【code-server】Code-Server 安装部署

Code-Server 安装部署 1.环境准备 可以参考 https://coder.com/docs/code-server/install code-server的安装流程进行安装&#xff0c;主机环境是 Centos7 建议使用 docker 方式进行安装&#xff0c;可能会出现如下报错&#xff0c;需要升级 GNC 的版本&#xff0c;由于影响交…

RabbitMQ配置与交换机学习

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

《吸血鬼猎人D》观后感

前言 在B站无意中发现了一部动漫电影《吸血鬼猎人D》&#xff0c;看着封面还不错&#xff0c;就试着点开了视频&#xff0c;看了一会儿&#xff0c;发现画面很精美&#xff0c;人物造型高大威猛&#xff0c;肌肉线条清晰可见。如果我没记错的话&#xff0c;这种风格在日本动漫中…

C语言复习总结(含代码例程)

数据类型 基本类型&#xff1a;字符型、整型、浮点型、双精度浮点型 构造类型&#xff1a;数组、指针、结构体、共用体和枚举 字符型&#xff1a; 类型表示&#xff1a; (signed) char char -- 有符号 char 型 unsigned char -- 无符号 char 型 类型大小&#xff…

平衡树之B树

平衡树 ├── AVL 树 ├── 红黑树 ├── 2-3 树 ├── B 树 ├── Splay 树 └── Treap没研究明白&#xff0c;算啦。不写了

Opus从入门到精通(一)简介

Opus从入门到精通(一):简介 Opus是什么? Opus编解码器是专门设计用于互联网的交互式语音和音频传输。它是由IETF的编解码器工作组设计的&#xff0c;合并了Skype的SILK和Xiph. Org的CELT技术。 Opus编解码器的设计目的是处理广泛的交互式音频应用程序,包括IP语音,视频,游戏…

列出docker常用的命令

一、基础命令 docker run 创建并启动一个容器 docker ps 列出当前运行的容器 docker ps -a 列出所有容器&#xff0c;包括未运行的 docker stop 停止一个运行中的容器 docker start 启动一个已停止的容器 docker restart 重启容器 docker rm 删除一个或多个容器 docker pull 从…

揭秘Netflix背后的魔法:如何用三层架构打造个性化推荐帝国

推荐系统就像一家餐厅的菜单推荐 想象一下&#xff0c;你走进一家餐厅&#xff0c;面对琳琅满目的菜单&#xff0c;不知道点什么好。这时候&#xff0c;服务员给你推荐了几道菜&#xff0c;这些推荐是基于你以往的口味偏好和其他顾客的选择。Netflix的推荐系统也是类似的&…

浅谈golang字符编码

1、 Golang 字符编码 Golang 的代码是由 Unicode 字符组成的&#xff0c;并由 Unicode 编码规范中的 UTF-8 编码格式进行编码并存储。 Unicode 是编码字符集&#xff0c;囊括了当今世界使用的全部语言和符号的字符。有三种编码形式&#xff1a;UTF-8&#xff0c;UTF-16&#…

【PL理论】(21) 函数式语言:支持匿名函数 fun x → E | 设计递归函数 | 支持递归函数:let rec ...

&#x1f4ad; 写在前面&#xff1a;本章我们将讲解支持匿名函数&#xff0c;先回顾一下 F# 语言表示函数的方法&#xff0c;然后引出它。随后我们讲解一下如何设计递归函数&#xff0c;最后让我们的 F- 语言支持递归函数。 目录 0x00 回顾&#xff1a;F# 语言 0x01 支持匿名…

iOS--oc对象,类,和元类本质

iOS--oc对象&#xff0c;类&#xff0c;和元类本质 前言实例对象的具体结构自定义类对象的结构继承关系 类信息的存放对isa、superclass总结 前言 最近在学习runtime的过程中&#xff0c;发现其中消息发送-动态方法解析-消息转发中涉及到了大量的类与对象的底层知识&#xff0…

[NCTF 2018]flask真香

打开题目后没有提示框&#xff0c;尝试扫描后也没有什么结果&#xff0c;猜想是ssti。所以尝试寻找ssti的注入点并判断模版。 模版判断方式&#xff1a; 在url地址中输入{7*7} 后发现不能识别执行。 尝试{{7*7}} ,执行成功&#xff0c;继续往下走注入{{7*7}}&#xff0c;如果执…

ubuntu certbot 生成https ssl证书

一、安装certbot应用 sudo apt update sudo apt install certbot python3-certbot-nginx二、生成证书 # 泛域名&#xff1a; certbot certonly -d *.你的主域名 --manual --preferred-challenges dns# 主域名&#xff1a; certbot certonly -d 你的主/子域名 --manual --pref…

java实战——图书管理项目

文章目录 项目所需要的技术栈项目演示项目准备工作环境准备数据库数据准备 前后端交互分析&#xff08;前端代码我们使用现成&#xff09;图书列表界面的创建查看前端发送的请求根据前端接收的返回值来编写model层根据请求编写controller层根据controller编写Service根据Servic…

代码随想录算法训练营第五十七 | 739. 每日温度、 496.下一个更大元素 I、503.下一个更大元素II

## 739. 每日温度 这里是引用 https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 第一次接触单调栈&#xff0c;看完视频讲解之后思路很清晰&#xff0c;对单调栈能够解决的问题类型有大致了解 class Solution { public:vector<int> dailyTemp…

SARscape5.6.2干涉叠加处理效率提升

SARscape5.6.2于2022年5月正式发布&#xff0c;包含若干更新和优化。干涉叠加处理模块在处理速度方面持续提升&#xff0c;表现在&#xff1a;PS干涉工作流处理、第一次反演和第二次反演优化&#xff0c;速度提升&#xff1b;SBAS处理干涉图生成和干涉图优化速度提升&#xff0…

C# WPF入门学习主线篇(二十)—— 资源和样式

C# WPF入门学习主线篇&#xff08;二十&#xff09;—— 资源和样式 欢迎来到C# WPF入门学习系列的第二十篇。在前面的章节中&#xff0c;我们探讨了布局管理及各种控件的使用。本篇博客将重点介绍WPF中的资源&#xff08;Resource&#xff09;和样式&#xff08;Style&#xf…

vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频

了解webrtc-streamer webrtc-streamer 是一个使用简单机制通过 WebRTC 流式传输视频捕获设备和 RTSP 源的项目&#xff0c;它内置了一个小型的 HTTP server 来对 WebRTC需要的相关接口提供支持。相对于ffmpegflv.js的方案&#xff0c;延迟降低到了0.4秒左右&#xff0c;画面的…