AW: Generic ObjectList und Suchen - Wie am besten ?
Zitat:
|
AW: Generic ObjectList und Suchen - Wie am besten ?
Kapiert. Nun bekomme ich eine Fehlermeldung:
E2010 Inkompatible Typen: 'System.SysUtils.TPredicate<Unit1.TDriverList<T>.T >' und 'Procedure' Code wie folgt:
Delphi-Quellcode:
Ehrlich gesagt sehe ich den Fehler nicht. Find will als Param ein TPredicate und meine anonyme Methode hat doch die passenden Params?
TDriverList<T: TDriverBase> = class(TObjectList<T>)
private protected public function Find(const Predicate: TPredicate<T>): T; function FindByIMEI(AIMEI: string): T; function FindByID(AID: string): T; end; [...] { TDriverList<T> } function TDriverList<T>.Find(const Predicate: TPredicate<T>): T; begin for Result in self do if Predicate(Result) then exit; Result:=nil; end; function TDriverList<T>.FindByID(AID: string): T; begin Result:=Find( function(Obj: TDriverBase): boolean begin Result:=(Obj.DriverID = AID); end); //<- Hier bleibt der Compiler stehen end; |
AW: Generic ObjectList und Suchen - Wie am besten ?
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:
Delphi-Quellcode:
function TDriverList<T>.FindByID(AID: string): T;
begin Result:=Find( function(Obj: T): boolean begin Result:=(Obj.DriverID = AID); // durch den Constraint weiß der Compiler, dass Obj von TDriverBase ist und kann auf seine Member zugreifen. end); end; |
AW: Generic ObjectList und Suchen - Wie am besten ?
Deine anonyme Funktion muß so aussehen:
Delphi-Quellcode:
[Edit]Kein rotes Fenster?[/EDIT]
function(Obj: T): boolean
begin Result:=(Obj.DriverID = AID); end); |
AW: Generic ObjectList und Suchen - Wie am besten ?
Dann war meine Vermutung, die ich insgeheim schon hatte, ja korrekt. In C# ist dieses "Mitdenken" des Compilers ja fast schon normal :D, bei Delphi weiß man nie so genau, wie weit Emba da Intelligenz eingebaut hat ;)
|
AW: Generic ObjectList und Suchen - Wie am besten ?
Zitat:
|
AW: Generic ObjectList und Suchen - Wie am besten ?
Und dann gibt es noch
Delphi-Quellcode:
und du hast deine Spezialklassen auch typsicher abgebildet ;)
TDriverList<T:TDriverBase> = ...
... function FindById( const AID : string ) : T; overload; function FindById<TFind : T>( const AID : string ) : TFind; overload; end; function TDriverList<T>.FindById<TFind>( const AID : string ) : TFind; begin Result := Find( function( Arg : T ) : Boolean begin Result := ( Arg is TFind ) and ( Arg.ID = AID ); end ) as TFind; end;
Delphi-Quellcode:
var
MyDriverList : TDriverList<TDriverBase>; MySpecialDriver : TSpecialDriver; MySpecialDriver := MyDriverList.FindById<TSpecialDriver>( '42' ); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz