Section courante

A propos

Section administrative du site

 Langage  Installation  Elément  Tutoriel  Programmation  Bibliothèque  Cadre d'application  GUI  Projet  Jeux  Outils  Emulateur  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Turbo Pascal 5
Turbo Pascal 5.5
Turbo Pascal 6
Turbo Pascal 7
Introduction
Les remarques
Les opérateurs
Les instructions conditionnelles
Les instructions de boucles
Type de données
Référence des unités
Références de mots réservés (mots clefs)
Définition de procédure et fonction
Référence de procédures et fonctions
Référence des directives de compilation
CRT
DOS
GRAPH
OBJECTS
OVERLAY
PRINTER
STRINGS
SYSTEM
TURBO3
WINDOS
Catégorie
Prototype
ASCIZ
Date
Ensemble
Fichier
Mémoire
Temps
Trigonométrie
Les premiers pas
Les jetons
Les constantes
Les types
Variables et constantes typées
Les expressions
Les instructions
Blocs, localité et étendue
Procédures et fonctions
Programmes et unités
Vue d'ensemble de la bibliothèque d'exécution
Procédures et fonctions standard
Entrée et sortie
Utilisation du 80x87
Interfaçage avec DOS
Utilisation de chaînes de caractères terminées par NULL
Utilisation de l'interface graphique Borland
Utilisation de recouvrement
Problèmes de mémoire
Problèmes de contrôle
Optimiser votre code
L'assembleur intégré
Liaison de code assembleur
Programmation orientée objet (POO)
Les fichiers
Les périphériques logiques
Files d'attente, piles, listes liées et arborescences
Bonjour
Affichage
Astronomie
Biochimie
Chimie
Conversion
Électrotechnique
Emulateur
Fichiers
Finance
Géographie
Géophysique
Géométrie
Histoire
Jeux & stratégies
Mathématique
Matrice
Médicale
Météorologie
Océanographie
Onirologie
Sport
Temps
Tri
Trigonométrie
Validation
«DRAW» du BASIC
Phase lunaire
Calcul du calcium corrigé
Calcul le taux d'alcoolémie
Bin,Hex,Base62,...
Emulateur de microprocesseur 6502
Texte séquentiel
IPaymt/Interet
NPer
PPaymt/Principal
Distance en Km entre deux longitudes et latitudes
Méridien de Paris
Triangulation d'une position (trilateration,...)
Aire d'un cercle
Aire d'une surface de prisme rectangulaire
Aire d'un triangle
Distance entre deux points
Treillis
Chiffre romain
Méthode du chiffre César (code César)
Asteroids
Bowling
Breakout
Lode Runner
Missile Command
Pac-Man
Patience
Peg Leap
Soko-Ban
Space Invaders
Space Jockey
Tetris
Tic-Tac-Toe
Tours d'Hanois
Ackermann
Exp
Factoriel
Fibonacci
Log
Nombre premier
Odd
Random
Sqrt
Triangle Pascal
Sommation
Hauteur utérine
Calcul de votre poids santé (IMC)
Unité de mesure
Fréquence des vagues
Hockey
Année bissextile
Calendrier
Date de la Pâque
FirstDayOfMonth
Horloge à aiguille
Tri à bulle (Bubble Sort)
Tri Shell Sort
ArcCos
ArcSin
Atn/ATan/ArcTan/ArcTangente
Cos
Sin
Courriel
AMDEKSYSTEM88LIB-TP
APMLIB-TP
BASICSTRLIB-TP
BIOSLIB-TP
COLORIMETRYLIB-TP
CSVLIB-TP
CYRIXLIB-TP
DRDOSLIB-TP
ELECTRICLIB-TP
ERLOGLIB-TP
FINANCIALLIB-TP
GEOLIB-TP
GRAPHICSSOLUTIONLIB-TP
HDLLIB-TP
HISTORICLIB-TP
HTMLLIB-TP
IALIB-TP
INTLLIB-TP
JSONLIB-TP
K8042LIB-TP
LETTRESLIB-TP
LOTUSSCRIPTSTRLIB-TP
METEOLIB-TP
OCEANOGRAPHICLIB-TP
OS2LIB-TP
OSSPASCALLIB-TP
POSIX-TP
PYTHONLIB-TP
SANE-TP
SNOBOLLIB-TP
SVGLIB-TP
TPW4TPLIB-TP
TSENGLABSET4000LIB-TP
VGALIB-TP
WINDOWS9XLIB-TP
XMLLIB-TP
Turbo Vision
UNITEST
MOS
AlimBase
AMIGADOS-0
AXTRO
Colorix
Corail
COREUTILS-0
DEV-COOLS
EDUX
FLEX-0
GEO-COMMANDER
HISTORIK
lettrex
LINUX-0
MATHIX
METEOPOLIS
Micro Calc
MYSTIX
Monsterbook
MSDOS-0
MSXDOS-0
OS9-0
Renegade BBS
Système Information
TRSDOS-0
Turbo Calc
UNIX-0
VIE
7iles
Arkanoid
Digger
Mario and Luigi
Turbo Assembler
Turbo Debugger
DOSBox
PCE - PC Emulator
PCem
Base de connaissances
Table ASCII
Table de codes ANSI et page de codes
RAM de l'IBM PC
Code d'erreur
Génération du code en interne du Turbo Pascal 3
Code source du Turbo Pascal 6
TPU
OBJ
Archives de paquet
Alternative
Bibliographie
Turbo Pascal à FreeDOS/FreePascal
Turbo Pascal à Linux/FreePascal
Turbo Pascal à FreeBSD/FreePascal
Turbo Pascal à eComStation/FreePascal
Préface
Notes légal
Dictionnaire
Recherche

Programmation orientée objet (POO)

La programmation orientée objet (POO) est une méthode de programmation imitant étroitement la façon dont nous faisons tous les choses. Il s'agit d'une évolution naturelle des innovations antérieures à la conception du langage de programmation : il est plus structuré que les tentatives précédentes de programmation structurée; et il est plus modulaire et abstrait que les tentatives précédentes d'abstraction de données et de masquage de détails. Trois propriétés principales caractérisent un langage de programmation orienté objet :

Les extensions de langage de Turbo Pascal vous offrent toute la puissance de la programmation orientée objet : plus de structure et de modularité, plus d'abstraction et de réutilisabilité intégrées directement dans le langage. Toutes ces fonctionnalités s'ajoutent à un code plus structuré, extensible et facile à entretenir.

Le défi de la programmation orientée objet est qu'elle vous oblige à mettre de côté des habitudes et des façons de penser à la programmation étant standard dans les années 1980. Une fois que vous avez fait cela, cependant, la POO est un outil simple, direct et supérieur pour résoudre de nombreux problèmes affligeant les programmes traditionnels.

Une note pour vous ayant fait de la programmation orientée objet dans d'autres langages : mettez de côté vos impressions précédentes sur la POO et apprenez les fonctionnalités orientées objet de Turbo Pascal selon leurs propres termes. La POO n'est pas une manière unique de programmer; c'est un continuum d'idées. Dans sa philosophie objet, Turbo Pascal ressemble plus à C++ qu'à Smalltalk. Smalltalk est un interpréteur, alors que depuis le début, Turbo Pascal est un pur compilateur de code natif. Les compilateurs de code natif font les choses différemment (et beaucoup plus rapidement) que les interpréteurs.

Et une note pour vous n'ayant aucune idée de ce qu'est la POO : c'est aussi bien. Trop de battage médiatique, trop de confusion et trop de gens parlant de quelque chose qu'ils ne comprennent pas ont considérablement brouillé les cartes ces dernières années. Efforcez-vous d'oublier ce que les gens vous ont dit sur la POO. La meilleure façon (en fait, la seule façon) d'apprendre quoi que ce soit d'utile sur la POO est de faire ce que vous êtes sur le point de faire : asseyez-vous et essayez-le vous-même.

Objets ?

Oui, des objets. Regardez autour de vous... il y en a une : la pomme que vous avez apportée pour le déjeuner. Supposons que vous alliez décrire une pomme en termes de logiciel. La première chose que vous pourriez être tenté de faire est de la séparer : Soit S la surface de la peau ; Soit J le volume fluide de jus qu'il contient ; Soit F le poids du fruit à l'intérieur ; Soit D le nombre de graines ....

Ne pensez pas de cette façon. Pensez comme un peintre. Vous voyez une pomme et vous peignez une pomme. L'image d'une pomme n'est pas une pomme ; c'est juste un symbole sur une surface plane. Mais il n'a pas été résumé en sept nombres, tous isolés et indépendants dans un segment de données quelque part. Ses composantes restent ensemble, dans leurs relations essentielles les uns avec les autres.

Les objets modélisent les caractéristiques et le comportement des éléments du monde dans lequel nous vivons. Ils constituent jusqu'à présent l'abstraction de données ultime.

Les objets conservent toutes leurs caractéristiques et leur comportement ensemble

Une pomme peut être séparée, mais une fois qu'elle a été séparée, ce n'est plus une pomme. Les relations des parties avec le tout et les unes avec les autres sont plus claires lorsque tout est conservé dans une seule enveloppe. C'est ce qu'on appelle l'encapsulation, et c'est très important. Nous reviendrons sur l'encapsulation dans quelques instants.

Tout aussi important, les objets peuvent hériter des caractéristiques et du comportement de ce que l'on appelle les objets ancêtres. C'est un saut intuitif; L'héritage est peut-être la plus grande différence entre la programmation Turbo Pascal orientée objet et la programmation Pascal Standard aujourd'hui.

Héritage

Le but de la science est de décrire le fonctionnement de l'univers. Une grande partie du travail de la science, dans la poursuite de cet objectif, consiste simplement à créer des arbres généalogiques. Lorsque les entomologistes reviennent d'Amazonie avec un insecte auparavant inconnu dans un bocal, leur préoccupation fondamentale est de déterminer où cet insecte s'inscrit dans le tableau géant sur lequel les noms scientifiques de tous les autres insectes sont rassemblés. Il existe des cartes similaires de plantes, de poissons, de mammifères, de reptiles, d'éléments chimiques, de particules subatomiques et de galaxies externes. Ils ressemblent tous à des arbres généalogiques : une seule catégorie globale au sommet, avec un nombre croissant de catégories sous cette seule catégorie, se déployant jusqu'aux limites de la diversité.

Dans la catégorie des insectes, par exemple, il y a deux divisions : les insectes aux ailes visibles et les insectes aux ailes cachées ou sans ailes du tout. Sous les insectes ailés se trouve un plus grand nombre de catégories : mites, papillons, mouches,... Chaque catégorie a de nombreuses sous-catégories, et sous ces sous-catégories se trouvent encore plus de sous-catégories.

Ce processus de classification est appelé taxonomie. C'est une bonne métaphore de départ pour le mécanisme d'héritage de la programmation orientée objet.

Les questions qu'un scientifique pose en essayant de classer un nouvel animal ou objet sont les suivantes : En quoi est-il similaire aux autres de sa classe générale ? En quoi est-ce différent ? Chaque classe différente a un ensemble de comportements et de caractéristiques la définissant. Un scientifique commence au sommet de l'arbre généalogique d'un spécimen et commence à descendre les branches, posant ces questions en cours de route. Les niveaux les plus élevés sont les plus généraux, et les questions les plus simples : Ailes ou pas ailes ? Chaque niveau est plus spécifique que le précédent et moins général. Finalement, le scientifique arrive au point de compter les poils sur le troisième segment des pattes postérieures de l'insecte, en effet spécifiques.

Le point important à retenir est qu'une fois qu'une caractéristique est définie, toutes les catégories sous cette définition incluent cette caractéristique. Ainsi, une fois que vous avez identifié un insecte comme membre de l'ordre des diptères (mouches), vous n'avez pas besoin de souligner qu'une mouche a une paire d'ailes. L'espèce d'insecte appelée mouches hérite de cette caractéristique.

Comme vous l'apprendrez bientôt, la programmation orientée objet est le processus de création d'arbres généalogiques pour les structures de données. L'une des choses importantes que la programmation orientée objet ajoute aux langages traditionnels comme Pascal est un mécanisme par lequel les types de données héritent des caractéristiques de types plus simples et plus généraux. Ce mécanisme est l'héritage.

Objets : enregistrements qui héritent

En termes Pascal, un objet ressemble beaucoup à un enregistrement, étant un enveloppe pour joindre plusieurs éléments de données liés sous un même nom. Supposons que vous vouliez développer un programme de paie produisant un rapport montrant combien chaque employé est payé chaque jour de paie. Vous pouvez mettre en page un enregistrement comme celui-ci :

  1. Type
  2.  TEmployee=Record
  3.   Name:String[25];
  4.   Title:String[25];
  5.   Rate:Real;
  6.  End;

TEmployee est ici un type d'enregistrement ; c'est-à-dire qu'il s'agit d'un modèle que le compilateur utilise pour créer des variables d'enregistrement. Une variable de type TEmployee est une instance de type TEmployee. Le terme instance est utilisé de temps en temps dans les cercles Pascal, mais il est utilisé tout le temps par les personnes POO, et vous feriez bien de commencer à penser en termes de types et d'instances de ces types.

Avec le type TEmployee, vous avez les deux sens : vous pouvez penser aux champs Name, Title et Rate séparément, ou lorsque vous devez penser aux champs travaillant ensemble pour décrire un travailleur particulier, vous pouvez les considérer collectivement comme TEmployee.

Supposons que vous ayez plusieurs types d'employés travaillant dans votre entreprise. Certains sont payés à l'heure, certains sont salariés, certains sont commissionnés,... Votre programme de paie doit tenir compte de tous ces types. Vous pouvez développer un type d'enregistrement différent pour chaque type d'employé. Par exemple, pour déterminer le salaire horaire d'un employé, vous devez savoir combien d'heures l'employé a travaillé. Vous pouvez concevoir un enregistrement THourly comme celui-ci :

  1. Type
  2.  THourly=Record
  3.   Name:String[25];
  4.   Title:String[25];
  5.   Rate:Real;
  6.   Time:Integer;
  7.  End;

Vous pouvez également être un peu plus malin et conserver le type d'enregistrement TEmployee en créant un champ de type TEmployee dans le type THourly :

  1. Type
  2.  THourly=Record
  3.   Worker:TEmployee;
  4.   Time:Integer;
  5.  End;

Cela fonctionne, et les programmeurs Pascal le font tout le temps. Une chose que cette méthode ne fait pas est de vous forcer à réfléchir à la nature de ce que vous manipulez dans votre logiciel. Vous devez poser des questions telles que : «En quoi un employé horaire diffère-t-il des autres employés ?» La réponse est la suivante : un employé horaire est un employé étant payé pour le nombre d'heures travaillées par l'employé. Repensez à la première partie de cette affirmation : un employé horaire est un employé...

Voilà !

Un enregistrement d'employé horaire doit avoir tous les champs existant dans l'enregistrement d'employé. Le type THourly est un type descendant du type TEmployee. THourly hérite de tout ce que possède TEmployee et ajoute tout ce qui est nouveau à propos de THourly pour rendre THourly unique. Ce processus par lequel un type hérite des caractéristiques d'un autre type est appelé héritage. L'héritier est appelé un type descendant; le type dont hérite le type descendant est un type ancêtre.

Les types d'enregistrement Pascal familiers ne peuvent pas hériter. Turbo Pascal, cependant, étend le langage Pascal pour prendre en charge l'héritage. L'une de ces extensions est une nouvelle catégorie de structure de données, liée aux enregistrements mais beaucoup plus puissante. Les types de données de cette nouvelle catégorie sont définis avec un nouveau mot réservé : Object. Un type d'objet peut être défini comme un type complet et autonome à la manière des enregistrements Pascal, ou il peut être défini comme un descendant d'un type d'objet existant en plaçant le nom du type ancêtre entre parenthèses après le mot réservé Object.

Dans l'exemple de paie que vous venez de regarder, les deux types d'objets liés seraient définis comme suit :

  1. Type
  2.  TEmployee=Object
  3.   Name:String[25];
  4.   Title:String[25];
  5.   Rate:Real;
  6.  End;
  7.  
  8.  THourly=Object(TEmployee)
  9.   Time:Integer;
  10.  End;

Ici, TEmployee est le type ancêtre et THourly est le type descendant. Comme vous le verrez un peu plus tard, le processus peut se poursuivre indéfiniment : vous pouvez définir des descendants de type THourly, et des descendants du type descendant de THourly,... Une grande partie de la conception d'une application orientée objet réside dans la construction de cette hiérarchie d'objets exprimant l'arbre généalogique des objets de l'application.

Tous les types héritant éventuellement de TEmployee sont appelés les types descendants de TEmployee, mais THourly est l'un des descendants immédiats de TEmployee. Inversement, TEmployee est l'ancêtre immédiat de THourly. Un type d'objet (tout comme un sous-répertoire DOS) peut avoir n'importe quel nombre de descendants immédiats, mais un seul ancêtre immédiat.

Les objets sont étroitement liés aux enregistrements, comme le montrent ces définitions. Le nouveau mot réservé object est la différence la plus évidente, mais il existe de nombreuses autres différences, dont certaines assez subtiles, comme vous le verrez plus tard.

Par exemple, les champs Name, Title et Rate de TEmployee ne sont pas explicitement écrits dans le type THourly, mais THourly les a quand même, en vertu de l'héritage. Vous pouvez parler de la valeur Name de THourly, tout comme vous pouvez parler de la valeur Name de TEmployee.

Instances de types d'objets

Les instances de types d'objets sont déclarées de la même manière que n'importe quelle variable est déclarée en Pascal, soit en tant que variables statiques, soit en tant que référents de pointeur alloués sur la mémoire de tas :

  1. Type
  2.  PHourly=^THourly;
  3.  
  4. Var
  5.  StatHourly:THourly; { Prêt à partir! }
  6.  DynaHourly:PHourly; { Doit être attribué avec New avant utilisation }

Les champs d'un objet

Vous accédez aux champs de données d'un objet de la même manière que vous accédez aux champs d'un enregistrement ordinaire, soit via l'instruction With, soit en pointant; Par exemple :

  1. BEGIN
  2.  AnHourly.Rate:=9.45;
  3.  With AnHourly do Begin
  4.   Name:='Sabourin, Arthur';
  5.   Title:='Traitement de texte';
  6.  End;
  7. END.

Il suffit de se rappeler dans un premier temps (cela vient naturellement éventuellement) que les champs hérités sont tout aussi accessibles que les champs déclarés dans un type d'objet donné. Par exemple, même si Name, Title et Rate ne font pas partie de la déclaration de THourly (ils sont hérités du type TEmployee), vous pouvez les spécifier comme s'ils étaient déclarés dans THourly :

  1. AnHourly.Name:='Arthur Sabourin';

Bonne pratique et mauvaise pratique

Même si vous pouvez accéder directement aux champs d'un objet, ce n'est pas particulièrement une bonne idée de le faire. Les principes de la programmation orientée objet exigent que les champs d'un objet soient laissés seuls autant que possible. Cette restriction peut sembler arbitraire et rigide au premier abord, mais elle fait partie de la vue d'ensemble de la POO étant construite dans cette page. Avec le temps, vous comprendrez le sens de cette nouvelle définition des bonnes pratiques de programmation, bien qu'il y ait encore du chemin à parcourir avant que tout ne se concrétise. Pour l'instant, prenez-le sur la foi : évitez d'accéder directement aux champs de données d'objet.

Alors, comment accède-t-on aux champs d'objet ? Qu'est-ce qui les fixe et les lit ?

La réponse est que les méthodes d'un objet sont utilisées pour accéder aux champs de données d'un objet chaque fois que cela est possible. Une méthode est une procédure ou une fonction déclarée dans un objet et étroitement liée à cet objet.

Méthodes

Les méthodes sont l'un des attributs les plus frappants de la programmation orientée objet, et il faut un certain temps pour s'y habituer. Commencez par revenir à cette vieille nécessité de la programmation structurée, en initialisant les structures de données. Considérez la tâche d'initialisation d'un enregistrement avec cette définition :

  1. Type
  2.  TEmployee=Record
  3.   Name:String[25];
  4.   Title:String[25];
  5.   Rate:Real;
  6.  End;

La plupart des programmeurs utiliseraient une instruction With pour attribuer des valeurs initiales aux champs Name, Title et Rate :

  1. Var
  2.  MyEmployee: TEmployee;
  3. BEGIN 
  4.  With MyEmployee do Begin
  5.   Name:='Arthur Sabourin';
  6.   Title:='Traitement de texte';
  7.   Rate:=9.45;
  8.  End;
  9. END.

Cela fonctionne bien, mais il est étroitement lié à une instance d'enregistrement spécifique, MyEmployee. Si plusieurs enregistrements TEmployee doivent être initialisés, vous en aurez besoin de plus avec des instructions faisant essentiellement la même chose. L'étape suivante naturelle consiste à construire une procédure d'initialisation généralisant l'instruction With pour englober toute instance d'un type TEmployee passé en paramètre :

  1. Procedure InitTEmployee(Var Worker:TEmployee; AName,ATitle:String;ARate:Real);Begin
  2.  With Worker do Begin
  3.   Name:=AName;
  4.   Title:=ATitle;
  5.   Rate:=ARate;
  6.  End;
  7. End;

Cela fait le travail, d'accord, mais si vous avez l'impression que c'est un peu plus idiot que ça ne devrait l'être, vous ressentez la même chose que les premiers partisans de la programmation orientée objet.

C'est un sentiment impliquant que vous avez conçu la procédure InitTEmployee spécifiquement pour servir le type TEmployee. Pourquoi, alors, devez-vous continuer à spécifier sur quel type d'enregistrement et quelle instance InitTEMPloyee agit ? Il devrait y avoir un moyen de fusionner le type d'enregistrement et le code le servant en un tout homogène.

Maintenant, il y a. Ça s'appelle une méthode. Une méthode est une procédure ou une fonction soudée si étroitement à un type donné que la méthode est entourée d'une instruction With invisible, rendant les instances de ce type accessibles depuis la méthode. La définition de type inclut l'entête de la méthode. La définition complète de la méthode est qualifiée par le nom du type. Le type d'objet et la méthode d'objet sont les deux faces de cette nouvelle espèce de structure appelée objet :

  1. Type
  2.  TEmployee=Object
  3.   Name,Title:String[25];
  4.   Rate:Real;
  5.   Procedure Init(NewName,NewTitle:String[25];NewRate:Real);
  6.  End;
  7.  
  8. Procedure TEmployee.Init(NewName, NewTitle:String[25];NewRate:Real);Begin
  9.  Name:=NewName;   { Le champ Name d'un objet TEmployee }
  10.  Title:=NewTitle; { Le champ Title d'un objet TEmployee }
  11.  Rate:=NewRate;   { Le champ Rate d'un objet TEmployee }
  12. End;

Maintenant, pour initialiser une instance de type TEmployee, vous appelez simplement sa méthode comme si la méthode était un champ d'un enregistrement, ce qui, dans un sens très réel, c'est :

  1. Var
  2.  AnEmployee:TEmployee;
  3.  
  4. BEGIN
  5.  AnEmployee.Init('Sonia Archambault, Gestionnaire de compte, 15000'); {Facile, non ? }
  6. END.


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Jeudi, le 6 juillet 2023