Bonjour,
Tout est dans le titre : dans une classe, quelle est la différence entre un champ et une property ? Quand est-il préférable d'utiliser l'un plutôt que l'autre ?
D'avance merci
Kim
Bonjour,
Tout est dans le titre : dans une classe, quelle est la différence entre un champ et une property ? Quand est-il préférable d'utiliser l'un plutôt que l'autre ?
D'avance merci
Kim
Salut
Un champ est une variable propre à un instance, c'est un nom associé à un type.
Un propriété spécifie comment on accède à un champ en précisant éventuellement un accesseur en lecture et/ou un accesseur en écriture.
L'accès au champ peut être direct mais le plus souvent on associe du code de contrôle.
Les propriété participent à la mise en oeuvre du principe d'encapsulation en simplifiant l'écriture du code, les accesseurs sont implicitement exécutés dès que la variable est lue ou écrite.
L'autre intérêt est de rendre le changement d'implémentation moins douloureux, par exemple on passe d'un accès direct à un accès contrôlé par des accesseurs, cela ne remet pas en cause le code utilisant la donnée.
Par principe, l'accès à tout champ public par nature devrait passer par une propriété publique, au moins, le champ devenant privé ou protégé.
Il est aussi possible de créer une propriété en lecture/écriture sans qu'elle soit rattachée à un champ de la classe.
Conventions
le champ est préfixé par la lettre F, en général de portée privée
le setter (accès en écriture) est préfixé par set, en général de portée privée
le getter (accès en lecture) est préfixé par get, en général de portée privée
Limitation
Le compilateur ne permet pas de passer un propriété par variable (var) dans une procédure.
Exemple : la propriété Age d'une classe TPersonne, avec un contrôle en écriture:
C'est clair ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 type TPersonne = class private FAge: Integer; procedure setAge(value: Integer); public property Age: Integer read FAge write setAge; End; procedure setAge(value: Integer); begin if (0<=Value) and (Value<=130) then FAge := Value else raise Exception.CreateFmt('Age %d invalide', [Value]); End;
![]()
M E N S . A G I T A T . M O L E M
Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal
"La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."
Et tout est dans l'aide de Delphi (extraits de la version 7) :
En bref, une propriété c'est une variable (un champ) "intelligente"Un champ est semblable à une variable appartenant à un objet.
Comme un champ, une propriété définit un attribut d'un objet. Mais alors qu'un champ n'est rien de plus qu'un emplacement de stockage dont le contenu peut être consulté et modifié, une propriété associe des actions spécifiques à la lecture et la modification de ses données.
.....
D'ailleurs une propriété n'est pas obligatoirement associée à un champ qui lui serait dédié, elle peut être entièrement "calculée".
Pour reprendre l'exemple de e-ric, la propriété Age pourrait être calculée, en lecture, à partir de la date de naissance (stockée par un autre champ ou obtenu de toute autre manière) et la date du jour. Dans ce cas précis l'affectation d'une valeur à la propriété Age n'aurait pas de sens et elle pourrait être déclarée en lecture-seule (pas de clause Write).
Merci à DomDA91 et e-ric,
Ce que vous m'avez répondu a précisé mon idée sur le sujet et l'a conforté.
Kim
Partager