Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
prog:lazarus:classes:creation_class [06/05/2020 16:12] thierry [overload] |
prog:lazarus:classes:creation_class [17/06/2023 17:11] (Version actuelle) thierry [inline] |
||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Création d'une Class ou d'un Object ====== | ====== Création d'une Class ou d'un Object ====== | ||
| + | ===== Déclaration d'une class ===== | ||
| + | <code delphi> | ||
| + | type | ||
| + | TMyClass = class(TObject) // TMyClass hérite de TObject | ||
| + | private | ||
| + | FSomeVar: integer; | ||
| + | public | ||
| + | constructor Create; overload; // overload = plusieurs définition de la même procédure sont disponibles | ||
| + | constructor Create(Args: array of integer); overload; | ||
| + | destructor Destroy; override; // override = redefini la méthode virtual du parent. | ||
| + | procedure DoSomethingLater; virtual; abstract; // Cette méthode n'existe pas ici, elle devra être implémentée dans les enfants de cette class | ||
| + | procedure DoEvent; virtual; | ||
| + | function GetSomeVar: integer; | ||
| + | procedure SetSomeVar(newvalue: integer); | ||
| + | published | ||
| + | property SomeVar: integer read GetSomeVar write SetSomeVar default 0; | ||
| + | end; | ||
| + | </code> | ||
| + | |||
| ===== Les modificateurs ===== | ===== Les modificateurs ===== | ||
| === virtual === | === virtual === | ||
| Ligne 30: | Ligne 49: | ||
| Ceci est également vrai pour les méthodes ''dynamic''.\\ | Ceci est également vrai pour les méthodes ''dynamic''.\\ | ||
| Cependant, vous ne pouvez pas remplacer une méthode si elle n'est pas ''virtual'' ou ''dynamic''. | Cependant, vous ne pouvez pas remplacer une méthode si elle n'est pas ''virtual'' ou ''dynamic''. | ||
| + | |||
| + | ''override'' peut résoudre l'erreur suivante : | ||
| + | <note warning>Warning: An inherited method is hidden by "xxxxx;"</note> | ||
| + | Mais si aprés avoir mis ''override'' on obtient a nouveau l'erreur : | ||
| + | <note warning>Error: There is no method in an ancestor class to be overridden: "xxxxx;"</note> | ||
| + | Il faut essayer ''reintroduce'' | ||
| === abstract === | === abstract === | ||
| Une méthode ''abstract'' est déclarée, mais non implémentée dans la classe de base. | Une méthode ''abstract'' est déclarée, mais non implémentée dans la classe de base. | ||
| + | |||
| + | Seule les membres ''virtual'' peuvent être ''abstract''. | ||
| + | <code delphi> | ||
| + | procedure test; virtual; abstract; | ||
| + | </code> | ||
| Les classes dérivées seront obligées de fournir leur propre implémentation. | Les classes dérivées seront obligées de fournir leur propre implémentation. | ||
| Ligne 58: | Ligne 88: | ||
| type | type | ||
| TParentClass = class | TParentClass = class | ||
| - | procedure SetTest(intNum: Integer); // Some method | + | procedure SetTest(intNum: Integer); |
| end; | end; | ||
| TDerivedClass = class(TParentClass) | TDerivedClass = class(TParentClass) | ||
| - | procedure SetTest(strName: String); reintroduce; // This replaces the method of the parent class in the derived class. And supresses warnings that a method with an identical signature already exists. | + | procedure SetTest(strName: String); reintroduce; |
| + | // Cela remplace la méthode de la classe mère dans la classe dérivée. | ||
| + | // Et supprime les avertissements qu'une méthode avec une signature identique existe déjà. | ||
| end; | end; | ||
| Ligne 69: | Ligne 101: | ||
| procedure TDerivedClass.SetTest(strName: String); | procedure TDerivedClass.SetTest(strName: String); | ||
| begin | begin | ||
| - | inherited SetTest(1); // Call method with same name from parent class, if needed | + | inherited SetTest(1); // Appel la méthode avec le même nom de la classe de parents, si nécessaire |
| end; | end; | ||
| </code> | </code> | ||
| + | === stdcall === | ||
| + | <note>ToDo</note> | ||
| + | === inline === | ||
| + | |||
| + | Le mot réservé inline permet au compilateur de copier une fonction ou une procédure à la place de son appel. | ||
| + | |||
| + | Si la fonction ou la procédure inline est utilisée fréquemment, cela augmente la vitesse du programme puisque le programme n'a pas besoin de passer à la sous-routine. | ||
| + | |||
| + | L'utilisation des fonctions et procédures inline est désactivée par défaut. Le commutateur du compilateur -Si ou {$inline on} active l'utilisation des fonctions et procédures inline. | ||
| + | |||
| + | |||
| + | inline est une indication du compilateur et le compilateur peut l'ignorer.\\ | ||
| + | Si le compilateur vous avertit qu'il n'a pas mis en ligne une certaine partie de code marquée comme inline, vous devez supprimer la directive inline.\\ | ||
| + | Il ne s'agit pas d'un bogue. Il s'agit de la complexité du code | ||
| + | |||
| + | === Absolute === | ||
| + | Source : [[https://wiki.freepascal.org/Absolute]] | ||
| + | Le modificateur ''absolute'' entraîne le stockage d'une variable au même emplacement de mémoire qu'une autre variable. | ||
| + | |||
| + | |||
| + | ===== Voir aussi ===== | ||
| + | * [[prog:lazarus:classes:manip_class]] | ||
| ===== Sources et Ressources ===== | ===== Sources et Ressources ===== | ||
| * [[https://wiki.freepascal.org/Class]] | * [[https://wiki.freepascal.org/Class]] | ||
| + | * [[https://wiki.freepascal.org/Reintroduce]] | ||