Delphi 2009で初めてジェネリックスを使用しようとしましたが、オブジェクトが指定されたものを実装しているかどうかを確認するために使用されるSupports関数への入力としてジェネリックタイプを使用する方法に困惑しています。インタフェース。私は問題を説明する小さなサンプルを作成しました。汎用インターフェイスタイプのSupports()関数の使用
次のタイプとユーティリティ関数を考える:私は何の問題を期待しないだろう
class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;
myInterface := GetInterface<IMyInterface>(myObject);
end;
が、私は以下のコンパイル時エラーを取得:
IMyInterface = interface
['{60F37191-5B95-45BC-8C14-76633826889E}']
end;
TMyObject = class(TInterfacedObject, IMyInterface)
end;
class function TFunctions.GetInterface<T>(myObject: TObject): T;
var
specificInterface: T;
begin
// This would compile, but looses the generic capability
//Supports(myObject, IMyInterface, specificInterface);
// This results in compile errors
Supports(myObject, T, specificInterface);
result := specificInterface;
end;
と、次のコードスニペットを
[DCCエラー] GenericExample.pas(37):E2029 '('が必要ですが、 '、'が見つかりました [DCCエラー] Generate icExample.pas(37):予想E2014ステートメントが、タイプの発現は「T」を、私は、コンパイラが関数の実引数として使用する場合、私はTで行うことを期待しているかわからないんだけど
を見つけました。
私はかなり多くを検索し、これを解読できませんでした。私の一部は、コンパイル時にインターフェイス名がIID:TGUID型に変換される方法を理解できれば、具体的なインターフェイス名を使用するといくらか進歩を遂げる可能性があると私は思っています。
ご迷惑をおかけして申し訳ありません。
TはGUIDを持つ特定のインターフェイスでなければならないという制約を適用できないのですか? –
何らかのインターフェースが必要な場合、コードは一般的ではありません。サポートはインタフェースリファレンスを返します。コンパイラは一般的にそれがTであるものに変換することはできません。 –
バリー、助けてくれてありがとう。ジェネリックプログラミングに関する私の経験は、C++のバックグラウンドからのものでしたが、インタフェース名が直接提供されているかどうかを知るのと同じ方法で、インタフェースにGuidがあるかどうかをコンパイラが知ることができると思いました。ジェネリックの<> C++テンプレートを知っているのは完璧な意味合いです。再度、感謝します。 – Chad