IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ PerlConsultez toutes les FAQ

Nombre d'auteurs : 18, nombre de questions : 250, dernière mise à jour : 29 octobre 2015  Ajouter une question

 

Bienvenue sur la FAQ Perl. Cette FAQ a pour vocation de vous enseigner ou de vous faire revoir les notions élémentaires de ce fantastique langage. Perl est très utilisé dans différents domaines depuis la gestion système, le réseaux, l'administration de bases de données, le web (CGI), la bureautique, la conception d'interfaces graphiques ou des contextes scientifiques telle la bioinformatique. Nous espérons que cette FAQ vous sera d'une grande utilité.

Vous souhaitez participer à l'amélioration de cette FAQ, n'hésitez pas !! Commentez

Bonne lecture !

SommaireProgrammation orientée objets en PerlUtilisation de l'orienté objet en Perl (6)
précédent sommaire suivant
 

Pour faire un héritage de classe en Perl, il suffit de créer dans la classe qui hérite un tableau nommé @ISA qui contiendra la ou les classes dont elle hérite ! Ce n'est pas plus compliqué que ça. Ce tableau sera déclaré avec our et non my. Le constructeur d'une telle classe contiendra un appel au(x) constructeur(s) de la (ou des) classe(s) dont elle hérite. Il obtiendra donc une référence consacrée, à laquelle il pourra rajouter ses propres variables, il consacrera à nouveau cette référence (il la liera avec la classe courante bien entendu) pour enfin la retourner.
Imaginons que le la classe Humain hérite d'une classe Animal qui définit les variables nom et age. A ces variables la classe Humain rajoutera la variable nationalité. On suppose que le constructeur de la classe Animal reçoit comme paramètre le nom et l'âge de l'animal à créer. Définissons le constructeur de la classe Humain qui recevra comme paramètre la nationalité de l'humain à créer.

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Humain; 
use strict; 
use Animal;    # Humain se servant des variables et méthodes de Animal, il faut inclure Animal 
our @ISA = ("Animal");    # Le fameux tableau... 
  
sub consthumain { 
  my ( $classe, $nat ) = @_; 
  
  #la ligne suivante appelle le constructeur d'Animal 
  my $this = $classe->SUPER::constanimal( "dupond", 35 ); 
  $this->{nationalite} = $nat;    # crée un champ age et lui affecte $nat 
  bless $this, $classe;           # lie la référence à la classe courante 
  return $this; 
}
Le SUPER:: demande à Perl d'aller chercher la méthode constanimal dans l'une des classes mères de Humain. Le constructeur sera appelé avec, comme invoquant, le nom de la classe en question. Pour invoquer les constructeurs, il suffit de faire :

Code perl : Sélectionner tout
my $dupond = Humain->consthumain("française");

Mis à jour le 21 février 2006 Woufeil

Pour ça, Perl vous simplifie la vie. En C++ il faudrait déclarer des fonctions virtuelles, ici nul besoin de faire quoi que ce soit, Perl choisira automatiquement la méthode la plus appropriée en fonction de l'invoquant. Comment ? Perl cherchera tout d'abord dans la classe de l'invoquant si la méthode invoquée existe. Si ce n'est pas le cas, Perl prendra le premier membre du tableau @ISA (qui sera donc une classe mère) et cherchera s'il existe une méthode correspondante dans cette classe, et ainsi de suite avec les autres classes mères en cas d'héritage multiple. Rappelez-vous du premier paramètre des méthodes et du fait qu'une référence "sait" à quelle classe appartient l'objet vers lequel elle pointe. Cela permet de comprendre comment le polymorphisme est mis en oeuvre aussi facilement.

Mis à jour le 21 février 2006 Woufeil

Oui, bien sûr ! Rappelez-vous, @ISA est un tableau, il ne contient pas forcément qu'un seul élément. Tous les éléments de @ISA sont les classes mères de la classe dans laquelle ce tableau est déclaré.

Mis à jour le 21 février 2006 Woufeil

Il y a un petit problème lors de la destruction d'un objet dont la classe hérite d'autres classes en Perl. En effet, dans ce cas, seul le destructeur de l'objet est appelé alors que normalement les destructeurs des classes mères devraient l'être également. La solution consiste à faire un appel direct du destructeur des classes mères dans le destructeur de la classe fille. Par exemple, si le destructeur reçoit une référence $this comme premier paramètre, l'appel se fera ainsi :

Code perl : Sélectionner tout
$this->SUPER::DESTROY();

Mis à jour le 21 février 2006 Woufeil

Parlons déjà des portées des variables de module. Si dans un module Mod1 vous avez créé une variable $var que vous avez déclarée avez my, elle ne sera accessible qu'au sein même du module. Mais si vous l'avez déclarée avec our, elle le sera aussi à l'extérieur du module. Comment y accéder ? Avec l'opérateur :: et en utilisant cette syntaxe :

Code perl : Sélectionner tout
1
2
$Mod1::var; 
#Attention, Mod1::$var est incorrect !
Imaginons que vous ayez défini une fonction fn() à l'intérieur de ce module. Comment appeler cette fonction ? Pareil que pour les variables :

Code perl : Sélectionner tout
Mod1::fn();
En généralisant, l'opérateur :: s'utilise ainsi :

Code perl : Sélectionner tout
<nom du module>::<nom de la variable ou de la fonction. Le symbole du type de variable sera rajouté au début de l'instruction>
Ce n'est pas plus compliqué que ça !

Mis à jour le 21 février 2006 Woufeil

Vous avez sûrement remarqué que les modules se terminent souvent par un étrange 1. Comme vous le savez, 1 est une valeur "vrai", à l'inverse de 0 ou de undef. Lors de l'exécution de la directive use, le code du module est exécuté sauf si Perl rencontre une valeur "faux" suivie d'un point virgule. Une valeur "faux" indiquera qu'il y a eu une erreur lors du chargement du module, un "vrai" que tout s'est bien passé, d'où l'ajout du 1; à la fin de chaque module.

Mis à jour le 21 février 2006 Woufeil

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.