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]] | ||