gpt4 book ai didi

delphi - 调用泛型类型的方法?

转载 作者:行者123 更新时间:2023-12-03 14:52:41 33 4
gpt4 key购买 nike

为什么下面的代码在 Delphi (XE) 中会产生错误?

unit UTest;

interface


type

TTest = class
public
procedure Foo<T>(A: T);
end;

implementation

{ TTest }

procedure TTest.Foo<T>(A: T);
begin
A.Add('hej');
end;

end.

我认为 Delphi 中的泛型类型只是简单地插入到泛型函数中,因此只有与没有 Add(string) 方法的类型一起使用时才会出错。

最佳答案

您的代码会产生编译错误,因为编译器无法知道 T 有一个名为 Add 的方法,该方法接收单个字符串参数。

I thought that generic types in Delphi was simply inserted into the generic function, so it would only error out if used with a type which don't have an Add(string) method.

如果您使用 Smalltalk 或 C++ 模板,那么您的假设将是准确的。但是,泛型与模板不同。对于泛型,您需要对类型参数应用约束。该约束需要告诉编译器 T 必须具有哪些属性。

例如,您可以将 T 限制为从具有合适的 Add 方法的类派生。或者,您可以限制 T 使用合适的 Add 方法实现接口(interface)。

Delphi 通用约束的文档链接:http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

可以应用的通用约束相当有限,这有点遗憾。例如,我希望能够限制一个类型具有某些数学运算符。例如,我希望能够将类型限制为具有 +- 运算符。然而,泛型和模板各有利弊,因此我承认这些限制是 Delphi 语言设计者合理设计决策的结果。

关于delphi - 调用泛型类型的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446470/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com