2012-06-05 10 views
6

Ich versuche, eine Eigenschaft zu schreiben, die Generika verwendet:Property mit Generics in Delphi

type TMyClass = class 
    protected 
    function GetCountBy<T: Class>: Integer; 
    public 
    property CountBy<T: Class>: Integer read GetCountBy<T>; 
    end; 

aber die Kompilierung fehl auf dem Grundstück Erklärung mit der Meldung ‚Property CountBy nicht in Basisklasse existieren‘, und der rote Kringel auf der Öffnung < des Eigentumsnamens.

Gibt es eine Möglichkeit, dies zu erreichen?

Edit: Hier ist mein anderer Anwendungsfall, die komplexer ist aber reale Welt:

property ItemsBy<T: Class>[Index: Integer]: T read GetItemsBy<T> write SetItemsBy<T>; 

Die Funktion filtert den Inhalt einer Liste des Index'th Element der angegebenen Klasse zurückzukehren.

+0

Sie brauchen einfach TDictionary hier. Generika sind für dieses Problem nicht geeignet. –

+0

-1. Dies wäre eine bessere Frage, wenn sie von einem Problem motiviert würde, das tatsächlich von Generika profitieren würde. Das Beispiel "generische Eigenschaft" in der Frage benötigt keine Generika. Dies kann eine gute Frage sein, die nach der richtigen Syntax für generische Eigenschaften fragt (wenn eine solche Syntax überhaupt existiert), aber das Beispielproblem, das durch eine solche Syntax gelöst werden soll, zeigt nicht wirklich die Notwendigkeit. –

Antwort

9

Allgemeinen Eigenschaften nicht in Delphi unterstützt. Nur generische Klassen oder generische Methoden.

Ich kann nichts in der Dokumentation finden, die diese Einschränkung explizit angibt. Auf der anderen Seite beschreibt die Dokumentation nur generische Klassen und generische Methoden. Und die new language grammar to support generics erwähnt auch keine Eigenschaften.

+1

Das ist richtig. –

1

Ich bin nicht oben auf Generika Geschwindigkeit sollte aber nicht die Deklaration mehr wie diese

type TMyClass<T: class> = class 
    protected 
    function GetCountBy<T>: Integer; 
    public 
    property CountBy<T>: Integer read GetCountBy<T>; 
    end; 
+0

@Lieveb, die Klasse enthält eine Liste von Objekten. Ich möchte, dass eine Eigenschaft eine Anzahl von Objekten einer bestimmten Klasse zurückgibt. Daher muss ich mich nicht selbst auf "genericalisiert" klassifizieren, sondern nur die Countby-Eigenschaft. (Ich kann dies mit einer Funktion tun, aber ich würde eher als eine Eigenschaft implementieren). –

+6

@MikeSutton - Warum würden Sie Generika überhaupt dafür verwenden? Kannst du deine Eigenschaft nicht einfach als 'Eigenschaft CountBy [AClass: TClass] deklarieren: Integer liest GetCountBy;' –

+1

@Lieven: nein, nicht unbedingt. Eine normale Klasse kann generische Methoden haben. Aber ich denke nicht, dass generische Eigenschaften auf diese Weise erlaubt sind. Die einzige Lösung besteht darin, die Klasse generisch und die Eigenschaft NICHT generisch zu machen. –