をサポートしている必要があり、私はそうのようなセットアップを持っている:パラメータインタフェースY
IBuilder = interface(IInvokable)
end;
IBuilder<T: IBuilder; TOut : TWinControl> = interface(IInvokable)
end;
TBuilder<T: IBuilder; TOut : TWinControl> = class(TInterfacedObject, IBuilder, IBuilder<T, TOut>)
end;
TBuilder = class(TBuilder<TBuilder, TWinControl>)
end;
この種の構造は、私はそうのような砂糖の構文を構築することができます:
TBuilder<T : IBuilder; TOut : TWinControl> = class(TInterfacedObject, IBuilder, IBuilder<T, TOut>)
function Output : TOut;
function Name(aName : string) : T;
function Left(aLeft : Integer) : T;
function Top(aTop : Integer) : T;
end;
// ... later
TBuilder.Create().Left(10).Top(5).Name('ABC'); // Nice one liner
問題があることです私は
E2514 The type parameter TBuilder must support interface 'IBuilder'.
これはおそらく、入力された制約T: IBuilder
preseによるものであると言って、コンパイル・エラーが発生しますTBuilderはIBuilderをサポートしていますが(祖先)
誰でもこの問題を回避する方法を教えてください。
けれども、私はこれを行うことができないTBuilder = class(TBuilder<IBuilder, TObject>)
おそらくベースタイプ、デルファイの「カスタム」パターンなどを使用して回避策があるかどうか知っていますか? – Ludo
@ルドーは何も気にしませんが、個人的には、私がこのアプローチを完全に避けるのは、それが本当にあなたにマイナーな砂糖よりも大きなメリットをもたらさない限りです。具体的なメリットがある場合は、実装する方が良いでしょう。あなたがこれをどのように働かせたいかについてもっと知らずに言うのは難しいです。 –