我有一個設置,如下所示:參數X型的必須支持接口Ÿ
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 nt在界面上,即使TBuilder確實支持IBuilder(通過它的祖先)。
任何人都可以請指導我如何解決這個問題?
雖然,我不能用TBuilder = class(TBuilder<IBuilder, TObject>)
你知道是否有一種解決方法使用可能的基本類型,delphi「自定義」模式或類似的東西嗎? – Ludo
@盧多沒有什麼可以想到的,但是我個人完全不採用這種方法,除非它確實爲您提供了一些對於一些小糖的實質性益處。如果它提供了一些實際的好處,那麼可能有更好的方法來實現它。很難說如果不知道更多關於你想如何工作。 –