(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(标准类的泛型方法)

本文主要是介绍(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(标准类的泛型方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

14.2.2 标准类的泛型方法

​ 使用泛型类型定义类可能是最常见的情况,但泛型类型也可以用于非泛型类。换句话说,一个普通的类也可以有一个泛型方法。在这种情况下,不仅要在创建类的实例时为泛型占位符指定类型,还要在调用方法时指定类型。下面是一个使用泛型方法的类示例。以下是来自GenericMethod示例的具有泛型方法的示例类:

typeTGenericFunction = classpublicfunction WithParam<T>(T1: T): string;end;

注解:当我第一次编写这段代码时,可能是因为我想起了我的C++时代,我将参数写成了(t:T)。不用说,在Object Pascal这样的不区分大小写的语言中,这不是一个好主意。编译器实际上会让它通过,但每次引用泛型类型T时都会发出错误。

​ 在一个类似的类方法中,你能做的并不多(至少除非你使用了本章后面将涉及的约束条件),所以我写了一些代码,使用了特殊的泛型类型函数(同样将在后面涉及)和一个特殊函数来将类型转换为字符串、 在此不做讨论:

function TGenericFunction.WithParam<T>(T1: T): string;
beginResult := GetTypeName(TypeInfo(T));
end;

​ 正如你所看到的,这个方法甚至不使用作为参数传递的实际值,而只是获取一些类型信息。同样,由于完全不知道 T1 的类型,在代码中使用它就变得相当复杂。

​ 您可以按以下方式调用此“全局泛型函数”的各个版本:

varGF: TGenericFunction;
beginGF := TGenericFunction.Create;
tryShow(GF.WithParam<string>('Foo'));Show(GF.WithParam<Integer>(122));Show(GF.WithParam('Hello'));Show(GF.WithParam(122));Show(GF.WithParam(Button1));Show(GF.WithParam<TObject>(Button1));
finallyGF.Free;
end;

​ 所有上述调用都是正确的,因为这些调用中的参数类型可以是隐式的。请注意,泛型类型显示(如指定或推断)而不是参数的实际类型,这解释了这个输出:

string
Integer
string
ShortInt
TButton
TObject

​ 如果在尖括号之间不指示类型调用该方法,则实际类型将从参数的类型中推断出来。如果使用类型和参数调用该方法,则参数的类型必须与泛型类型声明匹配。因此,以下三行将无法编译:

Show(GF.WithParam<Integer>('Foo'));
Show(GF.WithParam<string>(122));
Show(GF.WithParam<TButton>(Self));

这篇关于(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(标准类的泛型方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040294

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构