Sign in Join
Wiki copytemporary

Generics/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1+## Contents
2+
3+ * 1 Introduction
4+ * 2 Unité fgl
5+ * 2.1 Commençons
6+ * 3 Classes génériques personnalisées
7+ * 4 Détails techniques
8+ * 5 Exemple
9+ * 6 Voir aussi
10+ * 7 External links
11+
112## Introduction
213
3-Les types génériques de la **Free Generics Library** ou **FGL** sont une implémentation native des [[Templates/fr|patrons de classe]]. Les génériques sont parfois appelés types paramétrés. [[FPC/fr|FPC]] supporte officiellement les génériques depuis la version 2.2.
14+Les types génériques de la **Free Generics Library** ou **FGL** sont une implémentation native des [[Templates/fr|patrons de classe]]. Les génériques sont parfois appelés types paramétrés. [[FPC/fr|FPC]] supporte officiellement les génériques depuis la version 2.2.
415
516## Unité fgl
617
7-La façon la plus simple de commencer avec les génériques est [l'unité fgl](http://freepascal.org/docs-html/current/rtl/fgl/index.html) qui est le prototype d'un système base de classes géneriques. Jusqu'ici, il contient quelques classes basiques:
18+La façon la plus simple de commencer avec les génériques est [l'unité fgl](<http://freepascal.org/docs-html/current/rtl/fgl/index.html>) qui est le prototype d'un système base de classes géneriques. Jusqu'ici, il contient quelques classes basiques:
819
9-- TFPGList
10-- TFPGObjectList
11-- TFPGInterfacedObjectList
12-- TFPGMap
13-- TFPGMapInterfacedObjectData
20+ * TFPGList
21+ * TFPGObjectList
22+ * TFPGInterfacedObjectList
23+ * TFPGMap
24+ * TFPGMapInterfacedObjectData
1425
1526### Commençons
1627
17-Le simple exemple suivant montre comment stocker de multiples instances d'une classe définie par l'utilisateur dans une liste :
18-
19-``` pascal
28+Le simple exemple suivant montre comment stocker de multiples instances d'une classe définie par l'utilisateur dans une liste :
29+```
2030uses fgl;
21-
22-type
23- TMyClass = class(TObject)
24- fld1 : string;
25- end;
26-
27- TMyList = specialize TFPGObjectList<TMyClass>;
28-
29-var
30- list : TMyList;
31- c : TMyClass;
32-
33-begin
34- // create the list and add an element
35- list := TMyList.Create;
36- c := TMyClass.Create;
37- c.fld1 := 'c1';
38- list.Add(c);
39- // retrieve an element from the list
40- c := list[0];
31+
32+ type
33+ TMyClass = class(TObject)
34+ fld1 : string;
35+ end;
36+
37+ TMyList = specialize TFPGObjectList<TMyClass>;
38+
39+ var
40+ list : TMyList;
41+ c : TMyClass;
42+
43+ begin
44+ // create the list and add an element
45+ list := TMyList.Create;
46+ c := TMyClass.Create;
47+ c.fld1 := 'c1';
48+ list.Add(c);
49+ // retrieve an element from the list
50+ c := list[0];
4151```
4252
4353## Classes génériques personnalisées
4454
45-Si les génériques définies dans l'unité fgl ne vous suffisent pas, vous pour avoir besoin de définir vos propres classes génériques à partir de rien en utilisant les primtives sous-jacentes du langage.
46-
47-Une classe générique est définie en utilisant le [[Keyword/fr|mot-clé]] **generic** avant le nom de la classe dans sa déclaration :
55+Si les génériques définies dans l'unité fgl ne vous suffisent pas, vous pour avoir besoin de définir vos propres classes génériques à partir de rien en utilisant les primtives sous-jacentes du langage.
4856
49-``` pascal
57+Une classe générique est définie en utilisant le [[Keyword/fr|mot-clé]] **generic** avant le nom de la classe dans sa déclaration :
58+```
5059type
51- generic TList<T> = class
52- Items: array of T;
53- procedure Add(Value: T);
54- end;
60+ generic TList<T> = class
61+ Items: array of T;
62+ procedure Add(Value: T);
63+ end;
5564```
5665
57-Exemple d'implémentation de classe :
58-
59-``` pascal
66+Exemple d'implémentation de classe :
67+```
6068implementation
61-
62-procedure TList.Add(Value: T);
63-begin
64- SetLength(Items, Length(Items) + 1);
65- Items[Length(Items) - 1] := Value;
66-end;
69+
70+ procedure TList.Add(Value: T);
71+ begin
72+ SetLength(Items, Length(Items) + 1);
73+ Items[Length(Items) - 1] := Value;
74+ end;
6775```
6876
69-Une classe générique peut être spécialisée pour un type particulier en utilisant le mot-clé **specialize**.
70-
71-``` pascal
77+Une classe générique peut être spécialisée pour un type particulier en utilisant le mot-clé **specialize**.
78+```
7279Type
73- TIntegerList = specialize TList<Integer>;
74- TPointerList = specialize TList<Pointer>;
75- TStringList = specialize TList<string>;
80+ TIntegerList = specialize TList<Integer>;
81+ TPointerList = specialize TList<Pointer>;
82+ TStringList = specialize TList<string>;
7683```
7784
7885## Détails techniques
7986
80-1. Le compilateur analyse une générique, mais au lieu de produire du code, il enregistre tous les jetons ("token") dans un tampon de jetons à l'intérieur du fichier PPU.
87+ 1. Le compilateur analyse une générique, mais au lieu de produire du code, il enregistre tous les jetons ("token") dans un tampon de jetons à l'intérieur du fichier PPU.
8188
82-1. Le compilateur analyse une spécialisation ; pour cela, il charge le tampon de tokens du fichier PPU et l'analyse à nouveau. Il remplace les paramètres génériques (dans la plupart des exemples "T") par le type particulier spécifié (par exemple **LongInt**, **TObject**).
89+ 1. Le compilateur analyse une spécialisation ; pour cela, il charge le tampon de tokens du fichier PPU et l'analyse à nouveau. Il remplace les paramètres génériques (dans la plupart des exemples "T") par le type particulier spécifié (par exemple **LongInt** , **TObject**).
8390
84-Le code apparaît fondamentalement comme si la même classe avait été écrite comme la classe générique mais en remplaçant le type (formel) T par le type (effectif) spécifié.
91+Le code apparaît fondamentalement comme si la même classe avait été écrite comme la classe générique mais en remplaçant le type (formel) T par le type (effectif) spécifié.
8592
86-Donc en théorie, il n'y aurait pas de différence de vitesse d'exécution entre une classe "normale" et une générique.
93+Donc en théorie, il n'y aurait pas de différence de vitesse d'exécution entre une classe "normale" et une générique.
8794
8895## Exemple
8996
97+Un exemple de comment utiliser des génériques pour écrire une `function gmax()` qui prend la maximum de deux variables non encore typées. Remarquez que les fonctions sont nommées dans leur espace (_namespaced_) par leur nom de classe. Un inconvénient peut être que les génériques ne peuvent surchargées. Notez encore que l'opérateur devra être défini pour le type précisé lors de la spécialisation.
98+```
99+program UseGenerics;
100+
101+ {$mode objfpc}{$H+}
102+
103+ type
104+ generic TFakeClass<_GT> = class
105+ class function gmax(a,b: _GT):_GT;
106+ end;
107+
108+ TFakeClassInt = specialize TFakeClass<integer>;
109+ TFakeClassDouble = specialize TFakeClass<double>;
110+
111+ class function TFakeClass.gmax(a,b: _GT):_GT;
112+ begin
113+ if a > b then
114+ result := a
115+ else
116+ result := b;
117+ end;
118+
119+ begin
120+ // show max of two integers
121+ writeln( 'Integer GMax:', TFakeClassInt.gmax( 23, 56 ) );
122+ // show max of two doubles
123+ writeln( 'Double GMax:', TFakeClassDouble.gmax( 23.89, 56.5) );
124+ readln();
125+ end.
126+```
127+
128+
129+
90130## Voir aussi
91131
92-- [[Templates/fr|Patrons]]
93-- [[Generics proposals|Generics proposals (non traduit, intérêt historique uniquement)]]
94-- [[Data Structures, Containers, Collections/fr|Structures de données, Conteneurs, Collections]]
132+ * [[Templates/fr|Patrons]]
133+ * [[Generics proposals|Generics proposals (non traduit, intérêt historique uniquement)]]
134+ * [[Data Structures, Containers, Collections/fr|Structures de données, Conteneurs, Collections]]
95135
96136## External links
97137
98-- [Free Pascal: Reference guide - Generics](http://www.freepascal.org/docs-html/ref/refch8.html)
99-
100-\
138+ * [Free Pascal: Reference guide - Generics](<http://www.freepascal.org/docs-html/ref/refch8.html>)
101139
102140---
103-*From the Free Pascal wiki, page "Generics/fr", as it stood on 2019-07-01 after a change by Djzepi, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
141+*From the Free Pascal wiki, page "Generics/fr", as the Internet Archive kept it on 2023-06-02. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history