ある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.
今、私はそれを正しい方法でやっていますか?CallDoSomething
1つの型パラメーターだけで定義することは可能ですか?
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質問を言葉で表現する方法すら知らなかったので、より良いタイトルや説明の提案をいただければ幸いです。
これは私がそれをする方法です
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]
コメントを追加