2016-03-26 3 views
2

Ich experimentiere mit Delphi 10 Seattle und versuche, meine erste generische Container-Klasse zu erstellen. Ich muss mit einem generischen Comparer helfenÜbergeben eines benutzerdefinierten Vergleichers an ein generisches Erstellen Verfahren in Delphi

Hier ist ein einfaches Hash-Objekt, das ich erstellt:

type 
    TsmHeap<T> = class 
    private 
    fList: TList<T>; 
    Comparer: TComparer<T>; 
    procedure GetChildren(ParentIndex: integer; var Child1, Child2: integer); 
    function GetParent(ChildIndex: integer): integer; 
    function GetCapacity: integer; 
    function GetCount: integer; 
    function MustSwap(iParent, iChild: integer): boolean; 
    procedure SetCapacity(const Value: integer); 
    public 
    constructor Create(aComparer: TComparer<T>); overload; 
    constructor Create(aComparer: TCOmparer<T>; aCapacity: integer); overload; 

    destructor Destroy; override; 

    //-- Methods & Functions 
    function Dequeue: T; 
    procedure Enqueue(Item: T); 
    function IsEmpty: boolean; 

    //-- Properties 
    property Count: integer read GetCount; 
    property Capacity: integer read GetCapacity write SetCapacity; 
    end; 

Ich habe den Code für die Methoden schreiben und es kompiliert auf seine eigene ohne Probleme. Wenn ich versuche, eine Integer-Version der Klasse zu erstellen, kann ich sie nicht kompilieren.

Der problematische Code ist:

iHeap := TsmHeap<integer>.Create(TComparer<integer>.Construct(
    function(const Left, Right: integer): integer 
    begin 
    result := Sign(Left - Right); 
    end) 
); 

Diese geben eine „E2250 Es gibt keine überladene Version von‚Erstellen‘, die mit diesen Argumenten aufgerufen werden kann“

Was mache ich falsch? Wie erstelle ich den Comparer?

+1

'Sign' dient keinem Zweck und ist verschwenderisch. Ferner kann die Subtraktion sehr leicht überlaufen. Dies ist ein falscher Weg, einen Vergleich zu implementieren. –

Antwort

7

TComparer<T>.Construct gibt IComparer<T> zurück - es ist eine Klassenfunktion und kein Konstruktor. Ändern Sie einfach den Parametertyp von TsmHeap<T>.Create zu IComparer<T> und es sollte funktionieren.

+3

Zusätzlich: ich denke, dass private Feld 'Comparer' gleichen Typs' IComparer 'brauchen. Aber es gibt keinen Grund, es zu speichern, weil TList Comparer selbst speichern kann. – kami

+0

@Uwe hat funktioniert !! Danke vielmals! –

Verwandte Themen