Ich habe ein Setup wie so:Parameter des Typs X muss Schnittstelle unterstützen 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;
Diese Art von Struktur ermöglicht es mir, wie so eine Zucker Syntax zu erstellen:
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
Das Problem ist, dass ich erhalte einen Übersetzungsfehler, sagen, dass
E2514 The type parameter TBuilder must support interface 'IBuilder'.
Dies ist auf die typisierte Einschränkung T: IBuilder
Prese wahrscheinlich ist nt auf der Schnittstelle, obwohl TBuilder IBuilder (durch seinen Vorfahren) unterstützt.
Kann mir bitte jemand sagen, wie ich das umgehen soll?
Obwohl, kann ich nicht TBuilder = class(TBuilder<IBuilder, TObject>)
Wissen Sie, ob es einen Workaround gibt, der vielleicht einen Basistyp, das delphi "Gewohnheit" Muster oder etwas Ähnliches benutzt? – Ludo
@Ludo Nichts kommt in den Sinn, aber persönlich würde ich diesen Ansatz einfach vermeiden, es sei denn, es bietet Ihnen wirklich einen materiellen Vorteil gegenüber etwas weniger Zucker.Wenn es einen greifbaren Vorteil bietet, gibt es wahrscheinlich einen besseren Weg, es zu implementieren. Schwer zu sagen, ohne mehr darüber zu wissen, wie das funktionieren soll. –