2010-01-12 24 views
6

Come posso creare una classe generica contenente solo tipi primitivi?Tipi semplici con generici in Delphi

TField<T: xxx> = class 
private 
    FValue: T; 
public 
    property Value: T read FValue write FValue; 
end; 

Non ho bisogno di interfacce, classi, ecc, voglio solo booleani, interi, galleggianti e così via ...

O c'è un altro modo per farlo?

Grazie

risposta

0

Se si vuole limitare i tipi che possono essere utilizzati per il generico non puoi semplicemente verificare la presenza di tipi validi nella creazione?

1

Non sono sicuro che abbia ottenuto correttamente la domanda, ma se si desidera una variabile che può contenere tipi di dati primitivi diversi, è possibile dare un'occhiata al tipo di dati Variant.

Non avrebbe bisogno di farmaci generici per questo ;-)

+1

Delphi 2010, come parte dei suoi miglioramenti RTTI, ha introdotto il TValue nell'unità Rtti, che è essenzialmente una variante più leggera. Potrebbe essere leggermente migliore per il tuo scopo, supponendo che tu stia utilizzando D2010, naturalmente. –

+0

In realtà, alcune conversioni Variant dipendono dall'ambiente di runtime (impostazioni regionali, ecc.), In modo che possano ottenere risultati molto inaspettati. –

+0

@ Michael: +1 commento per menzionare TValue –

1

Secondo Craig Stuntz' blog

Il sistema di tipo Delphi/Win32 non è radicate (built-in tipi semplici, record, e le classi non hanno un antenato comune), e tipi primitivi non può/non implementare interfacce

così mo è probabile che non sia possibile limitare una classe generica a tipi primitivi (al contrario di C# che consente "dove T: struct")

+0

-1: puoi ; usa la restrizione "record" che menziona DanB. –

7

È possibile utilizzare la parola chiave "record" per vincolare a tipi di valori (non tipi di riferimento):

TField<T: record> = class 
private 
    FValue: T; 
public 
    property Value: T read FValue write FValue; 
end; 
+1

+1 per aver menzionato la parola chiave "record", come uno degli usi più intuitivi delle parole chiave nella lingua Delphi. –

+1

Nota anche se la parola chiave 'record' la limita ai tipi di valore, difficilmente si possono usare i valori. Basta dare un'occhiata ai cerchi che Allen Bauer aveva bisogno di passare solo per implementare gli operatori Equal e NotEqual per Nullable in questo articolo: http://blogs.embarcadero.com/abauer/2008/09/18/38869 –

+2

È divertente, tu non può fare le cose come: - // anche se è stupido ... - // si può inserire qualsiasi classe che eredita da TObject, ma non TObject sé che dire se voglio fare un pool oggetto generico per senza parametri oggetti contructor? TObjectPool I get "E2510 Type 'TObject' non è un vincolo valido" –