Historique de la question :
L'OO en Perl est réalisé sur la base de paquets (package) et d'un lien à travers la fonction bless. L'héritage est atteint grâce au tableau @ISA, qui détermine automatiquement à quels paquets Perl va chercher des méthodes. Le mécanisme de recherche met en œuvre ce qu'on appelle le MRO (method resolution order).
Problème :
Une gestion chaotique du tableau @ISA et l'utilisation de SUPER sans comprendre l'ordre de la recherche des méthodes mènent souvent à des erreurs, des appels doubles ou l'incapacité de redéfinir la fonctionnalité désirée. L'utilisation d'AUTOLOAD nécessite un contrôle pour éviter les pièges des boucles de recherche infinies.
Solution :
Exemple de code :
package Animal; sub speak { print "Animal speaks "; } package Dog; our @ISA = qw(Animal); sub speak { print "Dog barks! "; shift->SUPER::speak(); # appel de la méthode parent } my $dog = bless {}, 'Dog'; $dog->speak;
Caractéristiques clés :
Que se passe-t-il si plusieurs paquets parents dans la chaîne d'héritage ont des noms de méthodes identiques, lequel sera appelé ?
La recherche s'effectue de gauche à droite (dans l'ordre de déclaration de @ISA), le premier méthod trouvé sera appelé.
Que se passe-t-il si une méthode donnée est absente de tout l'arbre d'héritage, et que AUTOLOAD est implémenté uniquement chez un des parents ?
Perl appellera AUTOLOAD uniquement de la classe où il le trouve en premier dans la chaîne de recherche des méthodes. Les autres AUTOLOAD ne fonctionneront pas s'ils ne sont pas rencontrés plus tôt dans @ISA.
Peut-on changer l'ordre de la recherche des méthodes à la volée ?
Techniquement, il est possible de modifier le tableau @ISA à l'exécution, mais cela entraîne une fragilité et des erreurs difficiles à suivre. Cette approche est recommandée uniquement pour des cas spécifiques.
Plusieurs classes parent utilisant les mêmes noms de méthodes, leur ordre dans @ISA change de manière imprévisible manuellement, les méthodes invoquent SUPER, ce qui entraîne une récursivité infinie.
Avantages :
Inconvénients :
Modifications uniquement à travers la déclaration explicite de @ISA, et en cas de besoin d'héritage multiple — utilisation de modules spécialisés comme mro::Concise ou Class::C3.
Avantages :
Inconvénients :