Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:泛型子体的泛型列表,并将泛型作为参数_Delphi_Generics_Delphi 2010 - Fatal编程技术网

Delphi:泛型子体的泛型列表,并将泛型作为参数

Delphi:泛型子体的泛型列表,并将泛型作为参数,delphi,generics,delphi-2010,Delphi,Generics,Delphi 2010,我在理解泛型以及它们如何可以和不可以被使用方面有些困难 我有一个通用类TControlMediator,如下所示: TControlMediator<C, T> = class private FMediatedComponent: C; public constructor Create(ComponentToMediate: C); function GetValue: T; virtual; abstract; procedure SetValue(Value

我在理解泛型以及它们如何可以和不可以被使用方面有些困难

我有一个通用类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;

有人知道这应该怎么做吗?

Delphi的泛型类型没有协变或逆变。泛型类型必须使用实际类型作为参数。换言之,这:

TViewMediator = class
private
  FControlMediators: TList<TControlMEdiator<C, T>>;
public
  procedure registerMediator(AControlMediator: TControlMediator<C, T>);
  procedure unregisterMediator(AControlMediator: TControlMediator<C, T>);
end;
TViewMediator=class
私有的
FControlMediators:TList;
公众的
程序注册中介(AControlMediator:TControlMediator);
过程取消注册调解员(AControlMediator:TControlMediator);
结束;
…不起作用,因为C和t不是
TViewMediator
或实际类型的泛型类型参数


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

那么我基本上完蛋了?我的列表必须是一个很好的TObjects列表,并且没有办法将其中的对象强制转换为TControlMediator,这样我就可以调用其中的方法了?在我完全理解您为什么要这样做之前,我不能说您是否完蛋了。您可以将参数化为
TViewMediator
?我想注册不同类型的中介,比如:MyViewMediator.RegisterMediator(TEditMediator.create(someEdit));MyViewMediator.RegisterMediator(TComboMediator.create(someCombo));稍后,我想循环所有已注册的中介并对它们调用一个方法。您可以为泛型类型指定一个非泛型父类型,并使您的列表成为该类型的列表。是的,这就是我找到的解决方案。甚至可能是一个界面。
TViewMediator = class
private
  FControlMediators: TList<TControlMEdiator<C, T>>;
public
  procedure registerMediator(AControlMediator: TControlMediator<C, T>);
  procedure unregisterMediator(AControlMediator: TControlMediator<C, T>);
end;
[DCC Error] mediator.pas(23): E2003 Undeclared identifier: 'C'
[DCC Error] mediator.pas(28): E2007 Constant or type identifier expected
TViewMediator = class
private
  FControlMediators: TList<TControlMEdiator<C, T>>;
public
  procedure registerMediator(AControlMediator: TControlMediator<C, T>);
  procedure unregisterMediator(AControlMediator: TControlMediator<C, T>);
end;