2(マルチ)レイヤーのジェネリック型の仮想メソッドを呼び出すときに、追加の型パラメーターを削除するにはどうすればよいですか?

汚染

あるTBaseClassList<T: TBaseClass>仮想メソッドを持つクラスがDoSomethingこのメソッドを、外部の別のオープン構築型メソッドTBaseClassListとその子孫から呼び出したいと思いCallDoSomethingます。これは私のコードです:

type
  TBaseClass = class end;

  TBaseClassList<T: TBaseClass> = class
    class procedure DoSomething; virtual; abstract;
  end;

  TSubClass1 = class(TBaseClass) end;

  TSubClass1List = class(TBaseClassList<TSubClass1>)
    class procedure DoSomething; override;
  end;

  TDoSomethingCaller = class
    class procedure CallDoSomething<T: TBaseClass; L: TBaseClassList<T>>;
  end;

implementation

class procedure TSubClass1List.DoSomething;
begin
  ShowMessage('TSubClass1List.DoSomething');
end;

class procedure TDoSomethingCaller.CallDoSomething<T, L>;
begin
  L.DoSomeThing;
end;

initialization
  TDoSomethingCaller.CallDoSomething<TSubClass1, TSubClass1List>;
end.

今、私はそれを正しい方法でやっていますか?CallDoSomething1つの型パラメーターだけで定義することは可能ですか?

CallDoSomething私が試した他の定義は次のとおりです。

方法1:

class procedure CallDoSomething<L: TBaseClassList>;

私のDelphiはそれをコンパイルしません(私は10.1ベルリンを使用しています)。それは言う:

E2003宣言されていない識別子: 'TBaseClassList'

方法2:

class procedure CallDoSomething<T: TBaseClass>;
...
class procedure TDoSomethingCaller.CallDoSomething<T>;
begin
  TBaseClassList<T>.DoSomething;
end;

ランタイムエラーがあります:

プロジェクトは、メッセージ「抽象エラー」で例外クラスEAbstractErrorを発生させました。

方法3:

class procedure CallDoSomething<L: TSubClass1List>;

今、私は呼び出すことはできませんCallDoSomethingためTSubClass2List

PS質問を言葉で表現する方法すら知らなかったので、より良いタイトルや説明の提案をいただければ幸いです。

Dsm

これは私がそれをする方法です

type
  TBaseClass = class
  end;

  TBaseClassList = class
    class procedure DoSomething; virtual; abstract;
  end;

  TBaseClassList<T: TBaseClass> = class(TBaseClassList)
  end;

  TSubClass1 = class(TBaseClass)
  end;

  TSubClass1List = class(TBaseClassList<TSubClass1>)
    class procedure DoSomething; override;
  end;

  TDoSomethingCaller = class
    class procedure CallDoSomething<L: TBaseClassList>;
  end;

implementation

class procedure TSubClass1List.DoSomething;
begin
  inherited;
  ShowMessage('TSubClass1List.DoSomething');
end;

class procedure TDoSomethingCaller.CallDoSomething<L>;
begin
  L.DoSomething;
end;

initialization
  TDoSomethingCaller.CallDoSomething<TSubClass1List>;

end.

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ