Enregistrements ou classes?
Même si Delphi prend en charge les méthodes, les enregistrements sont toujours des citoyens de 2ème classe car il n'existe aucun support pour l'héritage d'enregistrements.
Les classes ont toutes les caractéristiques dont disposent les enregistrements ainsi que l'ensemble complet des fonctionnalités de POO, elles sont donc souvent un meilleur choix. Cependant, vous devez gérer la sémantique de référence qui nécessite de gérer manuellement la création et la destruction des classes sur des plates-formes non-ARC par rapport à la sémantique des valeurs sans souci des enregistrements qui ont un nettoyage automatique.
solution non génériques (en utilisant une classe)
Déclarez les conteneurs de chaîne comme un héritage de classe et de l'utilisation.
TRec1 = class(TPersistent)
S1: string;
S2: string;
procedure FromJSON(const AJSON: string);
function ToJSON: string;
end;
TRec2 = class(TRec1)
end;
procedure TRec1.FromJSON(const AJSON: string);
begin
RecordLoadJSON(Self, StringToUTF8(AJSON), Self.ClassInfo);
end;
function TRec1.ToJSON: string;
begin
Result := UTF8ToString(RecordSaveJSON(Self, Self.ClassInfo));
end;
Toutes les classes héritées de TPersistent
ont RTTI et donc les œuvres self.classinfo
. Vous devrez peut-être modifier l'appel RecordSaveJSON
en fonction de vos besoins.
solution Generics
Si vous avez RTTI activé pour votre unité {$M+}
et vous devez utiliser les enregistrements, il suffit d'utiliser des méthodes en dehors de l'enregistrement et de nourrir le type d'enregistrement en tant que paramètre générique.
TRec1 = record
data: typex;
....
end;
TDoJSONThings = record //helper record for any and all types with RTTI.
procedure FromJSON<T:record>(var Data: T; const JSON: string); static;
function ToJSON<T:record>(const [ref] Data: T): string; static;
end;
procedure TDOJSONThings.FromJSON<T>(var Data: T; const JSON: string); static;
var
pt: PTypeInfo;
begin
pt:= TypeInfo(T);
RecordLoadJSON(Data, StringToUTF8(AJSON), pt);
end;
function TDOJSONThings.ToJSON<T:record>(const [ref] Data: T): string; static;
var
pt: PTypeInfo;
begin
pt:= TypeInfo(T);
Result:= UTF8ToString(RecordSaveJSON(Data, pt));
end;
Remarques
L'utilisation d'un record helper
(comme dans THelper = record helper for TRec1
) ne fonctionnera pas, car cela ne fonctionne que pour TRec1
et les dossiers malheureusement ne prend pas en charge l'héritage.
Il aurait été préférable d'utiliser des méthodes autonomes, mais Delphi n'autorise pas les méthodes génériques qui ne font pas partie d'un enregistrement ou d'une classe.
Oh, et laissez tomber la construction de style packed record
des années 1970. Cela n'a d'autre but que de ralentir votre code en le désalignant.
Vous ne pouvez pas faire cela avec un assistant. Faites une paire de fonctions pour le faire. Et BTW, l'emballage du disque ne fait pas de bien, il conduit juste à l'enregistrement étant désaligné. –