Programmation orientée objet Perl
Il existe deux implémentations différentes de la programmation orientée objet en Perl :
L'une est basée sur des tables de hachage anonymes, où l'essence de chaque instance d'objet est une référence à une table de hachage anonyme. Dans cette table de hachage anonyme, tous les attributs d'instance sont stockés.
L'autre est basée sur des tableaux. Lors de la définition d'une classe, nous créons un tableau pour chaque attribut d'instance, et l'essence de chaque instance d'objet est une référence à un indice d'une ligne dans ces tableaux. Dans ces tableaux, tous les attributs d'instance sont stockés.
Concepts de base de la programmation orientée objet
La programmation orientée objet comporte de nombreux concepts de base. Nous en abordons ici trois : les objets, les classes et les méthodes.
ObjetUn objet est une référence à un élément de données dans une classe.
ClasseUne classe est un package Perl qui contient les méthodes fournies pour l'objet.
MéthodeUne méthode est une sous-routine Perl dont le premier paramètre est le nom de la classe.
Perl fournit la fonction bless(), qui est utilisée pour construire des objets. En associant une référence au nom de la classe via bless, le retour de cette référence construit un objet.
Définition de classe
Une classe n'est qu'un simple package.
Vous pouvez utiliser un package comme une classe et utiliser les fonctions du package comme méthodes de la classe.
Les packages Perl fournissent des espaces de noms indépendants, de sorte que les méthodes et les noms de variables de différents packages n'entrent pas en conflit.
Les fichiers de classe Perl ont l'extension .pm.
Ensuite, nous créons une classe Person :
package Person;
La portée du code d'une classe s'étend jusqu'à la dernière ligne du fichier de script, ou jusqu'au prochain mot-clé "package".
Création et utilisation d'objets
Pour créer une instance (objet) d'une classe, nous devons définir un constructeur. La plupart des programmes utilisent le nom de la classe comme constructeur, mais en Perl, vous pouvez utiliser n'importe quel nom.
Vous pouvez utiliser diverses variables Perl comme objets Perl. Dans la plupart des cas, nous utilisons des références à des tableaux ou à des hachages.
Ensuite, nous créons un constructeur pour la classe Person, en utilisant une référence de hachage Perl.
Lors de la création d'un objet, vous devez fournir un constructeur, qui est une sous-routine renvoyant une référence à l'objet.
L'exemple est le suivant :
Exemple
Ensuite, nous créons un objet :
$object = new Person( "小明", "王", 23234345);
Définition des méthodes
Les méthodes de classe Perl ne sont que des sous-programmes Perl, c'est-à-dire ce que l'on appelle communément des fonctions membres.
Dans la POO Perl, la définition d'une méthode ne fournit aucune syntaxe spéciale, mais elle exige que le premier paramètre d'une méthode soit l'objet ou le package à partir duquel elle est référencée.
Perl ne fournit pas de variables privées, mais nous pouvons gérer les données d'objet via des méthodes auxiliaires.
Ensuite, nous définissons une méthode pour obtenir le nom :
sub getFirstName {
return $self->{_firstName};
}
Cela peut aussi s'écrire comme ceci :
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName);
return $self->{_firstName};
}
Ensuite, nous modifions le code dans le fichier Person.pm comme suit :
Exemple
Le code du script employee.pl est le suivant :
Exemple
Après l'exécution du programme ci-dessus, la sortie est :
$ perl employee.pl 名字:小明 姓氏:王 编号:23234345 设置前姓名为 : 小明 设置后姓名为 : 小强
Héritage
En Perl, les méthodes de classe sont héritées via le tableau @ISA, qui contient les noms d'autres paquetages (classes). L'héritage des variables doit être défini explicitement.
L'héritage multiple se produit lorsque ce tableau @ISA contient plusieurs noms de classes (paquetages).
Via @ISA, seules les méthodes peuvent être héritées ; les données ne peuvent pas être héritées.
Ensuite, nous créons une classe Employee qui hérite de la classe Person.
Le code du fichier Employee.pm est le suivant :
Exemple
Maintenant, la classe Employee contient toutes les méthodes et attributs de la classe Person. Nous saisissons le code suivant dans le fichier main.pl et l'exécutons :
Exemple
Après l'exécution du programme ci-dessus, la sortie est :
$ perl main.pl 名字:小明 姓氏:王 编号:23234345 设置前姓名为 : 小明 设置后姓名为 : 小强
Redéfinition de méthode
Dans l'exemple ci-dessus, la classe Employee hérite de la classe Person. Toutefois, si les méthodes de la classe Person ne peuvent pas répondre aux exigences, elles doivent être redéfinies.
Ensuite, nous ajoutons quelques nouvelles méthodes à la classe Employee et redéfinissons des méthodes de la classe Person :
Exemple
Nous saisissons le code suivant dans le fichier main.pl et l'exécutons :
Exemple
Après l'exécution du programme ci-dessus, la sortie est :
$ perl main.pl 名字:小明 姓氏:王 编号:23234345 这是子类函数 设置前姓名为 : 小明 这是子类函数 设置后姓名为 : 小强
Chargement automatique
Si la méthode demandée est introuvable dans la classe actuelle, toutes les classes de base de la classe actuelle, ou la classe UNIVERSAL, Perl cherche alors une méthode nommée AUTOLOAD(). Si AUTOLOAD est trouvée, elle est appelée, et la variable globale $AUTOLOAD est définie au nom pleinement qualifié de la méthode manquante.
Si cela échoue encore, Perl déclare une erreur et échoue.
Si vous ne voulez pas hériter d'AUTOLOAD de la classe de base, c'est simple : une seule ligne :
sub AUTOLOAD;
Destructeurs et ramasse-miettes
Lorsque la dernière référence à un objet est libérée, l'objet est automatiquement détruit.
Si vous voulez faire quelque chose pendant la destruction, vous pouvez définir une méthode nommée "DESTROY" dans la classe. Elle est automatiquement appelée au moment approprié et effectue des actions de nettoyage supplémentaires comme vous les définissez.
package MyClass;
...
sub DESTROY
{
print "MyClass::DESTROY called\n";
}
Perl passe la référence de l'objet comme unique paramètre à DESTROY. Notez que cette référence est en lecture seule, ce qui signifie que vous ne pouvez pas la modifier en accédant à $_
Si vous re-bénissez la référence de l'objet avant que le destructeur ne retourne, Perl appellera alors la méthode DESTROY de l'objet que vous avez re-béni après le retour du destructeur. Cela vous donne l'occasion d'appeler le destructeur de la classe de base ou d'une autre classe que vous spécifiez. Il convient de noter que DESTROY peut également être appelé manuellement, mais c'est généralement inutile.
Après la libération de l'objet courant, les autres objets contenus dans l'objet courant sont automatiquement libérés.
Exemple orienté objet en Perl
Nous pouvons mieux comprendre l'application de la POO en Perl à travers l'exemple suivant :
Exemple
En exécutant le programme ci-dessus, la sortie est :
调用 MyClass 方法 MyClass::new called MyClass::MyMethod called! 调用 MySubClass 方法 MySubClass::new called MyClass::new called MyClass::MyMethod called! MySubClass::MyMethod called! 创建一个作用域对象 MyClass::new called MyClass::DESTROY called 创建对象 MyClass::new called MyClass::DESTROY called 脚本执行结束... MyClass::DESTROY called MySubClass::DESTROY calledAutres extensions