2009-09-06 6 views
13

J'ai remarqué que lorsque vous appelez les méthodes d'une superclasse, vous devez faire quelque chose comme ceci:Pourquoi l'appel SUPER de Perl n'utilise-t-il pas la méthode de la flèche?

my $self = $class->SUPER::new(); 

Pourquoi est-ce pas:

my $self = $class->SUPER->new(); 
+1

Geo, si vous voulez apprendre les détails des objets dans perl, prenez une copie de l'objet orienté Perl Damian Conway http://www.manning.com/conway/ Il va dans le détail de différentes façons de utilisez les fonctions OOP de Perl. Il a tout de hachages bénis de base à la génération de méthode dynamique, à exotica comme coderefs bénis. C'est un livre très bien écrit. Mais aussi vérifier Moose. Pour beaucoup, sinon la plupart, les choses Moose est la bonne façon de faire Perl OOP. – daotoad

Répondre

14

Je soupçonne que $class->SUPER->new() serait normalement le même que $class->SUPER()->new(). Mais il n'y a pas de fonction $class->SUPER(), et ce n'est pas clair ce que cela reviendrait.

D'autre part, $class->Foo::Bar a toujours été une manière valide d'appeler directement une méthode par son nom complet, ce qui rend un package spécial - SUPER - mieux. (Je pense que vous pouvez réellement mettre en œuvre SUPER comme un paquet, et peut-être il était historiquement, je ne sais pas)

PS: Jetez un oeil à l'emballage mro et $self->next::method. Aussi, jetez un oeil à Moose si vous allez faire un travail OO sérieux en Perl.

+9

Je veux comprendre les choses derrière moi avant d'utiliser Moose. – Geo

+3

Découvrez _A Gentle Introduction à Moose_ http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html –

+2

@Geo, Vous * pensez * que vous voulez en savoir plus. Je peux honnêtement vous dire que vous feriez mieux de ne pas le savoir, jusqu'à ce que vous tombiez dessus. –

7

Pour ajouter à ce que derobert dit:

Vous appelez « nouveau » dans l'espace « SUPER » mais passer l'objet (ou une chaîne), « $ class ».

Vous ne ont à utiliser SUPER, comme vous pouvez donner le nom complet du paquet du parent (utile en cas d'héritage de diamant):

sub init { 
    my $self = shift; 
    $self->ParentClass1::init(); 
    $self->ParentClass2::init(); 
} 
+3

Autre trivia: Vous pouvez réellement faire '$ self-> TotallyUnrelatedClass :: init()', bien qu'il soit probablement préférable de ne pas le faire! – derobert

13

Les appels de méthode ont un certain nombre de formes:

appels de méthode, peut-être hérité:

->method() 

appelle explicitement sous package :: méthode, que ce soit dans l'arbre d'héritage ou non:

->Package::method() 

appelle explicitement la visée à sous, que ce soit dans l'arbre d'héritage ou non:

->$coderef() 

appelle la méthode qui aurait été appelé par __PACKAGE__->method() s'il n'y avait pas de méthode sous dans __PACKAGE__ (NB la classe ou de l'objet à gauche de -> est hors de propos):

->SUPER::method() 

Tout ce qui précède, selon le contenu de $method:.

->$method() 

(même juridique sous use strict;)

Bien que la première forme soit la plus répandue, il vaut la peine d'en apprendre davantage sur les autres et sur leur fonctionnement.

13

En résumé, SUPER n'est pas une méthode. C'est un paquet virtuel. Il est documenté dans perlobj sous la section "Invocation de méthode".

Notez cependant que SUPER se base sur le package en cours, pas sur le package de l'instance avec laquelle vous l'avez utilisé.

Questions connexes