Delphi:ジェネリック子孫のジェネリックリストおよびジェネリックをパラメータとして使用

StackOverflow https://stackoverflow.com/questions/1632884

  •  06-07-2019
  •  | 
  •  

質問

ジェネリックの理解と、ジェネリックの使用方法と使用方法の理解に少し苦労しています。

次のような汎用クラス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;

コンパイラは致命的なエラーで停止します:

[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>>、スコープにタイプCまたはTがない場合、タイプではありません。ジェネリック型のインスタンス化でジェネリック型プレースホルダーを使用することはできません。これらのプレースホルダーが、ジェネリック型またはメソッドを含むジェネリック引数としてスコープ内にある場合を除きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top