2009-07-30 13 views
2

Ich habe Probleme Generika zu bekommen in dem folgenden Szenario zu arbeiten:Schnittstellen und Generics

Delphi stellt die Schnittstelle IComparable:

IComparable <T> = interface 
    function CompareTo (Value : T) : Integer; 
end; 

ich hinzufügen, eine andere Schnittstelle IPersistent:

IPersistent = interface 
    function ToString : String; 
    procedure FromString (const Str : String); 
end; 

One Beispiel einer Klasse, die beide Schnittstellen implementiert:

TComparableString = class (TInterfacedObject, IComparable <String>, IPersistent) 
strict private 
    FValue : String; 
public 
    function CompareTo (Value : String) : Integer; 
    function ToString : String; 
    procedure FromString (const Str : String); 
end; 

nun für eine andere generische Klasse, die zwei Schnittstellen Einschränkungen hat:

ISortIndex <VALUE_TYPE : IPersistent, IComparable> = interface 
    ... 
end; 

Und schließlich eine Implementierung dieser Schnittstelle: Jetzt

TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable> = class (TInterfacedObject, ISortIndex <VALUE_TYPE>) 

    ... 
end; 

wenn ich versuche, eine Art Index wie das zu erklären:

FSortIndex : ISortIndex <TComparableString>; 

Ich bekomme eine Fehlermeldung

[DCC Error] Database.pas(172): E2514 Type parameter 'VALUE_TYPE' must support interface 'IComparable' 

Ich habe mehrere Dinge ausprobiert, aber ich kann es nicht zum Laufen bringen.

Wer hat Hilfe? Vielen Dank!

Antwort

6

Ihre Klasse TComparableString implementiert die nicht generische Schnittstelle IComparable nicht, so dass sie die Typenzwangsbedingung nicht erfüllt. Sie müssen entweder die Einschränkung ändern oder IComparable implementieren.

Ändern der Einschränkung ist wahrscheinlich der einfachste Weg nach vorne. Ich weiß nicht wirklich Delphi, aber sehen, ob das funktioniert:

ISortIndex <VALUE_TYPE : IPersistent, IComparable<VALUE_TYPE>> = interface 

TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable<VALUE_TYPE>> = 
    class (TInterfacedObject, ISortIndex <VALUE_TYPE>) 

EDIT: Ich hatte nicht bemerkt, dass Ihre TComparableString implementiert IComparable<String> statt IComparable<TComparableString>. Ist das Absicht? Normalerweise ist etwas mit anderen Instanzen von sich selbst vergleichbar, nicht mit einem anderen Typ.

Sie könnten einen anderen Typ-Parameter auf ISortIndex/TSimpleSortIndex, um den Typ angeben einzuführen, dass VALUE_TYPE vergleichbar sein sollte - aber ich Verdächtiger es ist sinnvoller TComparableString zu ändern.

+0

Ich habe das versucht. Dies führt zu folgendem Fehler: "E2514 Type Parameter 'VALUE_TYPE' muss Schnittstelle 'IComparable ' unterstützen." – jpfollenius

+0

Ah, ich verstehe warum. Bearbeiten ... –

+0

Ich wollte eigentlich TComparableString anstelle von String verwenden. Alles scheint jetzt gut zu funktionieren. Danke für die schnelle und präzise Hilfe! – jpfollenius