2012-06-05 10 views
6

sto cercando di scrivere una proprietà che utilizza farmaci generici:struttura utilizzando Generics a Delfi

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

ma la compilazione fallisce sulla dichiarazione di proprietà con il messaggio 'Proprietà CountBy non esiste nella classe base', e il filo rosso sull'apertura < del nome della proprietà.

Esiste un modo per raggiungere questo obiettivo?

Edit: Ecco l'altro mio caso d'uso, che è più complessa ma più del mondo reale:

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

La funzione filtra i contenuti di un elenco per restituire l'articolo Index'th della classe specificata.

+0

Hai semplicemente bisogno di TDictionary qui. I generici non sono adatti a questo problema. –

+0

-1. Questa sarebbe una domanda migliore se fosse motivata da un problema che potrebbe effettivamente beneficiare dei farmaci generici. L'esempio "proprietà generica" ​​nella domanda non ha bisogno di generici. Questo potrebbe essere una bella domanda che chiede la sintassi corretta per le proprietà generiche (se anche tale sintassi esiste), ma il problema di esempio da risolvere con tale sintassi non dimostra realmente la necessità. –

risposta

9

proprietà generiche non sono supportati in Delphi. Solo classi generiche o metodi generici.

Non riesco a trovare nulla nella documentazione che afferma esplicitamente tale limitazione. D'altra parte la documentazione descrive solo classi generiche e metodi generici. E lo new language grammar to support generics non menziona nemmeno le proprietà.

+1

Questo è corretto. –

1

Io non sono fino a velocità sui farmaci generici, ma non dovrebbe essere più la dichiarazione come questo

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

@Lieveb, la classe contiene un elenco di oggetti. Voglio una proprietà per restituire un conteggio di oggetti di una determinata classe, quindi non ho bisogno di classificare se stesso in "genericalizzato", solo la proprietà Countby. (Posso farlo con una funzione, ma preferirei implementarla come una proprietà). –

+6

@ MikeSutton - Perché dovresti usare generici per quello? Non puoi semplicemente dichiarare la tua proprietà come 'proprietà CountBy [AClass: TClass]: Intero leggere GetCountBy;' –

+1

@Lieven: no, non necessariamente. Una classe normale può avere metodi generici. Ma non penso che le proprietà generiche siano consentite in questo modo. L'unica soluzione è rendere la classe generica e la proprietà NON generica. –