I. Qu'est-ce qu'une classe abstraite ?▲
En programmation orientée objet (POO), une classe abstraite est une classe qui ne peut être instanciée. Elle ne peut être utilisée que comme classe de base dans une relation d'héritage. En général, dans ce genre de classe, seules les déclarations de méthodes sont définies, et il faudra écrire le contenu des méthodes dans les classes dérivées. Une classe abstraite permet aussi de définir les caractéristiques communes à plusieurs classes.
II. WinDev et les classes abstraites▲
Depuis les dernières versions, WinDev a amélioré la possibilité de programmer en objet. Avant la version 19, on ne pouvait pas définir si elle est publique ou abstraite. Nous pouvons pallier cela en changeant l'accès du constructeur. Cette astuce permettra de créer une classe non instanciable et donc abstraite. Nous allons découvrir cette possibilité à l'aide d'un exemple et nous verrons comment déclarer une classe abstraite depuis la version 19.
II-A. Définition des classes▲
Nous allons définir deux classes :
-
ac_document : représente un objet de type document.
Elle est composée de trois attributs :- ls_auteur : auteur du document,
- ls_titre : titre du document,
- ls_reference : référence du livre.
Ces trois attributs possèdent des propriétés en lecture et en écriture ;
- pc_livre : représente un livre et hérite de ac_document.
Elle hérite des trois attributs de ac_document et on y ajoute un attribut
li_nbPage : nombre de pages du livre.
L'attribut possède des propriétés en lecture/écriture.
ac_document est
une
Classe
PRIVÉE
ls_auteur est
une
chaîne
ls_titre est
une
chaîne
ls_reference est
une
chaîne
FIN
PROCEDURE
auteur()
RENVOYER
:
ls_auteur
PROCEDURE
auteur(
ps_auteur est
une
chaîne
)
:
ls_auteur =
ps_auteur
PROCEDURE
Titre
()
RENVOYER
:
ls_titre
PROCEDURE
Titre
(
ps_titre est
une
chaîne
)
:
ls_titre =
ps_titre
PROCEDURE
Reference()
RENVOYER
:
ls_reference
PROCEDURE
Reference(
ps_reference est
une
chaîne
)
:
ls_reference =
ps_reference
PROCEDURE
PUBLIC Constructeur()
//Pas de code
pc_livre est
une
Classe
hérite
de
ac_document
PRIVÉE
li_nbPage est
un
entier
FIN
PROCEDURE
NbPages()
RENVOYER
:
li_nbPage
PROCEDURE
NbPages(
pi_nbPages est
un
entier
)
:
li_nbPage =
pi_nbPages
PROCEDURE
Constructeur()
Ancêtre
:
Constructeur()
Nous laissons l'accès des constructeurs public pour visualiser le comportement de WinDev, ensuite nous changerons celui de la classe ac_document.
II-B. Instanciation des classes▲
Les classes étant créées, je vais les instancier dans le code d'initialisation d'une fenêtre.
WinDev ne génère pas d'erreur de compilation, il nous laisse la possibilité d'instancier un objet de type ac_document.
II-C. Avant la version 19▲
Dans ce paragraphe nous allons voir comment contourner l'absence de notion de classe abstraite avant la version 19. Pour pouvoir introduire une « notion » de classe abstraite dans notre projet, nous allons modifier l'accès du constructeur « ac_document ». L'accès devient protégé. Maintenant, retournons à notre code où sont instanciés les objets. WinDev a généré une erreur de compilation.
Avec le message suivant :
Erreur : Le support des constructeurs privés est disponible à partir de la version 16 (permet de réaliser des classes abstraites, des interfaces, ou des « factory »).
Le constructeur de la classe 'ac_document' n'est pas public, la création d'une instance de 'ac_document' est interdite.
EXPRESS_Fenêtre1, Initialisation, ligne 1, colonne 20
II-D. Depuis la version 19▲
Depuis la version 19 WinDev introduit un nouveau mot-clé « abstraite » permettant de déclarer une classe abstraite, voyons cela avec une mise en application.
ac_document est
une
Classe
,
abstraite
PRIVÉE
ls_auteur est
une
chaîne
ls_titre est
une
chaîne
ls_reference est
une
chaîne
FIN
III. Conclusion▲
Nous venons de voir à travers ce document comment déclarer une classe abstraite
- avant la version 19 ou WinDev ne gérait pas explicitement les classes abstraites ;
- après la version 19, avec l'introduction du mot clé « abstraite ».
EDIT : 19/03/2016, mise à jour de l'article initiale pour prendre en compte la nouveauté de la version 19.