Sign in Join
Wiki copytemporary

Generics/fr: what changed

Revision 2 to 3. 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-
121## Introduction
132
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.
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.
154
165## Unité fgl
176
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:
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:
198
20- * TFPGList
21- * TFPGObjectList
22- * TFPGInterfacedObjectList
23- * TFPGMap
24- * TFPGMapInterfacedObjectData
9+- TFPGList
10+- TFPGObjectList
11+- TFPGInterfacedObjectList
12+- TFPGMap
13+- TFPGMapInterfacedObjectData
2514
2615### Commençons
2716
28-Le simple exemple suivant montre comment stocker de multiples instances d'une classe définie par l'utilisateur dans une liste :
29-```
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
3020uses fgl;
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];
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];
5141```
5242
5343## Classes génériques personnalisées
5444
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.
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.
5646
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-```
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 :
48+
49+``` pascal
5950type
60- generic TList<T> = class
61- Items: array of T;
62- procedure Add(Value: T);
63- end;
51+ generic TList<T> = class
52+ Items: array of T;
53+ procedure Add(Value: T);
54+ end;
6455```
6556
66-Exemple d'implémentation de classe :
67-```
57+Exemple d'implémentation de classe :
58+
59+``` pascal
6860implementation
69-
70- procedure TList.Add(Value: T);
71- begin
72- SetLength(Items, Length(Items) + 1);
73- Items[Length(Items) - 1] := Value;
74- end;
75-```
7661
77-Une classe générique peut être spécialisée pour un type particulier en utilisant le mot-clé **specialize**.
62+procedure TList.Add(Value: T);
63+begin
64+ SetLength(Items, Length(Items) + 1);
65+ Items[Length(Items) - 1] := Value;
66+end;
7867```
68+
69+Une classe générique peut être spécialisée pour un type particulier en utilisant le mot-clé **specialize**.
70+
71+``` pascal
7972Type
80- TIntegerList = specialize TList<Integer>;
81- TPointerList = specialize TList<Pointer>;
82- TStringList = specialize TList<string>;
73+ TIntegerList = specialize TList<Integer>;
74+ TPointerList = specialize TList<Pointer>;
75+ TStringList = specialize TList<string>;
8376```
8477
8578## Détails techniques
8679
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.
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.
8881
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**).
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**).
9083
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é.
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é.
9285
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.
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.
9487
9588## Exemple
9689
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-
13090## Voir aussi
13191
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]]
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]]
13595
13696## External links
13797
138- * [Free Pascal: Reference guide - Generics](<http://www.freepascal.org/docs-html/ref/refch8.html>)
98+- [Free Pascal: Reference guide - Generics](http://www.freepascal.org/docs-html/ref/refch8.html)
13999
140100---
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).*
101+*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).*

Back to history