gpt4 book ai didi

Delphi:泛型后代的泛型列表并以泛型作为参数

转载 作者:行者123 更新时间:2023-12-03 15:49:16 25 4
gpt4 key购买 nike

我在理解泛型以及如何使用和不可以使用它们方面遇到了一些困难。

我有一个像这样的通用类 TControlMediator:

TControlMediator<C, T> = class
private
FMediatedComponent: C;
public
constructor Create(ComponentToMediate: C);

function GetValue: T; virtual; abstract;
procedure SetValue(Value: T); virtual; abstract;

property MediatedControl: C read FMediatedComponent;
end;

然后,我为我想要调解的每个控件类型创建“具体”子类:

TEditMediator = class(TControlMediator<TEdit, string>)
public
function GetValue: string; override;
procedure SetValue(Value: string); override;
end;

到目前为止,一切似乎都正常。但是,当我想要 TControlMediator 后代的列表,或者将 TControlMediator 作为方法的参数时,就会出现问题:

TViewMediator = class
private
FControlMediators: TList<TControlMEdiator<C, T>>;
public
procedure registerMediator(AControlMediator: TControlMediator<C, T>);
procedure unregisterMediator(AControlMediator: TControlMediator<C, T>);
end;

编译器因 fatal error 而停止:

[DCC Error] mediator.pas(23): E2003 Undeclared identifier: 'C'
[DCC Error] mediator.pas(28): E2007 Constant or type identifier expected

有人知道如何做到这一点吗?

最佳答案

Delphi 的泛型类型没有协变或逆变。您的泛型类型必须使用实际类型作为参数。换句话说,这个:

TViewMediator = class
private
FControlMediators: TList<TControlMEdiator<C, T>>;
public
procedure registerMediator(AControlMediator: TControlMediator<C, T>);
procedure unregisterMediator(AControlMediator: TControlMediator<C, T>);
end;

...不起作用,因为 C 和 T 不是 TViewMediator 的泛型类型参数或实际类型。

TControlMediator<TEdit, string>是一种类型。 TList<TControlMEdiator<C, T>> ,当没有类型时 CT在范围内不是类型。不能在泛型类型的实例化中使用泛型类型占位符,除非这些占位符在范围内作为包含泛型类型或方法的泛型参数。

关于Delphi:泛型后代的泛型列表并以泛型作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1632884/

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