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:03] thierry [abstract] |
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. | ||
=== overload === | === overload === | ||
+ | Avec la directive sur la ''overload'', vous pouvez déclarer de nombreuses méthodes, fonctions ou procédures sous le même nom mais avec des types et des paramètres différents. | ||
+ | <code delphi> | ||
+ | function MultiSum(a, b: integer): integer; overload; | ||
+ | function MultiSum(a, b: AnsiString): AnsiString; overload; | ||
+ | </code> | ||
+ | === reintroduce === | ||
+ | Le modificateur ''reintroduce'' appartient à la programmation orientée objet. | ||
+ | |||
+ | Le modificateur ''reintroduce'' permet à une méthode de la classe parente d'être masquée par une nouvelle méthode du même nom.\\ | ||
+ | C'est-à-dire qu'une nouvelle méthode existe dans la classe dérivée de la classe parente et dans toutes les autres classes dérivées de celle-ci. \\ | ||
+ | La méthode de la classe parente est préservée et peut toujours être utilisée par celle-ci. | ||
+ | |||
+ | La méthode de la classe parente n'existe plus dans la nouvelle classe, elle a été remplacée par la nouvelle méthode du même nom. La méthode continue d'exister sous sa forme originale dans la classe parente et peut être utilisée par celle-ci. | ||
+ | |||
+ | Cela s'oppose à l'écrasement du modificateur qui ne fonctionne que pour les méthodes ''virtual''. | ||
+ | |||
+ | La réintroduction du modificateur ne fait que supprimer un avertissement indiquant qu'une méthode similaire existe déjà et que le programmeur en est conscient. | ||
+ | |||
+ | <code delphi> | ||
+ | interface | ||
+ | |||
+ | type | ||
+ | TParentClass = class | ||
+ | procedure SetTest(intNum: Integer); | ||
+ | end; | ||
+ | |||
+ | TDerivedClass = class(TParentClass) | ||
+ | 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; | ||
+ | |||
+ | implementation | ||
+ | |||
+ | procedure TDerivedClass.SetTest(strName: String); | ||
+ | begin | ||
+ | inherited SetTest(1); // Appel la méthode avec le même nom de la classe de parents, si nécessaire | ||
+ | end; | ||
+ | </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 ===== | ||
+ | * [[https://wiki.freepascal.org/Class]] | ||
+ | * [[https://wiki.freepascal.org/Reintroduce]] | ||