Forum: Object-Pascal / Delphi-Language
by Stevie,
6. Aug 2014
So kann man es auch ausdrücken. Aber die Sache ist gerade bei Generics eher die, dass C# Type Variance kann und Delphi nicht. Und dass man dort eher Lambdas benutzt, die sowieso Type Inference können.
Forum: Object-Pascal / Delphi-Language
by Stevie,
6. Aug 2014
Die Fehlermeldung gibt dir hier leider nicht den letzlich zielführenden Hinweis, dass eigentlich die Signaturen nicht passen.
Find will TPredicate<T> und du gibst nur eine für TPredicate<TDriverBase> passende Funktion hinein.
Da du bei der Definition ja den Constraint TDriverBase auf T gesetzt hast, kannst kannst du einfach das hier schreiben:
function TDriverList<T>.FindByID(AID: string):...
Forum: Object-Pascal / Delphi-Language
by Stevie,
6. Aug 2014
Hasse recht, sofern kein constraint auf T liegt, muss es allerdings Result := Default(T); heißen.
Forum: Object-Pascal / Delphi-Language
by Stevie,
6. Aug 2014
function TMyObjectList<T>.Search(const predicate: TPredicate<T>): T;
begin
for Result in Self do
if predicate(Result) then
Exit;
end;
TPredicate<T> ist in SysUtils definitiert.
Forum: Object-Pascal / Delphi-Language
by Stevie,
6. Aug 2014
Die Ideallösung habe ich oben bereits geschrieben. Wenn du dir nämlich anschaust, wo sich deine ganzen Funktionen unterscheiden, siehst du, dass es immer das Suchkriterium ist. Und genau das kannst du mit einer Predicate lösen, du gibst nämlich dann in die Search Methode die anonyme Methode hinein, die das Kriterium auf dein Item anwendet und dir sagt, obs passt oder nicht.
Forum: Object-Pascal / Delphi-Language
by Stevie,
6. Aug 2014
type
TMyObjectList<T> = class(TObjectList<T>);
public
function Search(const predicate: TPredicate<T>): T;
end;
Einsatz:
myDriver := driverList.Search(
function(d: TDriver): Boolean