Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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:07]
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 40: Ligne 70:
 function MultiSum(a, b: AnsiString):​ AnsiString; overload; function MultiSum(a, b: AnsiString):​ AnsiString; overload;
 </​code>​ </​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 ===== ===== Sources et Ressources =====
   * [[https://​wiki.freepascal.org/​Class]]   * [[https://​wiki.freepascal.org/​Class]]
 +  * [[https://​wiki.freepascal.org/​Reintroduce]]