Achtergrond van de vraag:
OOP in Perl is geïmplementeerd op basis van pakketten (package) en het koppelen van verwijzingen via de functie bless. Overerving wordt bereikt door de array @ISA, die automatisch bepaalt in welke pakketten Perl naar methoden zoekt. Het zoekmechanisme implementeert de zogenaamde MRO (method resolution order).
Probleem:
Chaotisch beheer van de array @ISA en het gebruik van SUPER zonder begrip van de volgorde van methodenzoeken leiden vaak tot fouten, dubbele aanroepen of de onmogelijkheid om gewenste functionaliteit te overschrijven. Gebruik van AUTOLOAD vereist controle om valstrikken van oneindige zoekcycli te vermijden.
Oplossing:
Voorbeeldcode:
package Animal; sub speak { print "Animal spreekt "; } package Dog; our @ISA = qw(Animal); sub speak { print "Dog blaft! "; shift->SUPER::speak(); # aanroep van de oudermethode } my $dog = bless {}, 'Dog'; $dog->speak;
Belangrijke kenmerken:
Als er meerdere parent-pakketten zijn in de overervingsketen met dezelfde methodenamen, welke zal dan worden aangeroepen?
De zoekopdracht wordt van links naar rechts uitgevoerd (op volgorde van verklaring in @ISA), de eerste gevonden methode wordt aangeroepen.
Wat gebeurt er als een bepaalde methode ontbreekt in de gehele overervingsboom, en AUTOLOAD alleen bij een van de ouders is geïmplementeerd?
Perl zal alleen AUTOLOAD aanroepen van de klasse waarvan het als eerste wordt gevonden in de methodenzoekketen. Overige AUTOLOAD-aanroepen zullen niet werken als ze niet eerder in @ISA worden aangetroffen.
Is het mogelijk om de volgorde van methodenzoeken tijdens runtime te wijzigen?
Technisch gezien is het mogelijk om de array @ISA tijdens runtime te wijzigen, maar dit leidt tot fragiliteit en moeilijk te traceren fouten. Deze aanpak wordt alleen aanbevolen voor specifieke gevallen.
Meerdere ouderklassen met dezelfde methodenamen worden gebruikt, hun volgorde in @ISA verandert onvoorspelbaar handmatig, methoden roepen SUPER aan, wat leidt tot oneindige recursie.
Voordelen:
Nadelen:
Wijzigingen alleen via expliciete verklaring van @ISA, en bij behoefte aan meervoudige overerving - gebruik van gespecialiseerde modules zoals mro::Concise of Class::C3.
Voordelen:
Nadelen: