2009-09-06 10 views
13

he notado que cuando se llama a los métodos de una superclase, que tiene que hacer algo como esto:¿Por qué la llamada SUPER de Perl no utiliza el método de flecha?

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

¿Por qué no es que:

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

Geo, si desea conocer los detalles más nítidos de los objetos en Perl, recoja una copia de Objectian Perl orientado a objetos de Damian Conway http://www.manning.com/conway/ Explica con gran detalle las diferentes formas de usa las características de OOL de Perl. Tiene de todo, desde hashes benditos básicos hasta generación de métodos dinámicos, hasta exoticos como codereds benditos. Es un libro muy bien escrito. Pero también echa un vistazo a Moose. Para muchos, si no para la mayoría, las cosas de Moose son la forma correcta de hacer Perl OOP. – daotoad

Respuesta

14

sospecho porque $class->SUPER->new() normalmente sería el mismo que $class->SUPER()->new(). Pero no hay una función $class->SUPER(), y no está claro qué devolvería.

Por otro lado, $class->Foo::Bar siempre ha sido una forma válida de llamar a un método directamente por nombre completo, por lo que hacer una cosa especial de paquete - SUPER - cabe en mejor. (Sospecho que en realidad se podría aplicar SUPER como un paquete, y puede que históricamente era, no sé)

PS: Tome un vistazo al paquete mro y $self->next::method. Además, eche un vistazo a Moose si va a hacer un trabajo serio de OO en Perl.

+9

Quiero entender las cosas antes de usar Moose. – Geo

+3

Echa un vistazo a _A Gentle Introduction to Moose_ http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html –

+2

@Geo, solo piensas * que quieres saber más. Honestamente puedo decirte que es mejor que no lo sepas hasta que te encuentres con él. –

7

que añadir a lo dicho Derobert:

Estás llamando 'nuevo' en el espacio de nombres del 'super', pero pasándole el objeto (o cadena), '$ class'.

usted NO tienen utilizar Super, como se puede dar el nombre completo del paquete del padre (útil en casos de herencia de diamante):

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

Otros trivia: en realidad puedes hacer '$ self-> TotallyUnrelatedClass :: init()', ¡aunque es mejor que no lo haga! – derobert

13

llamadas a métodos tienen varias formas:

llamadas de método, posiblemente heredado:

->method() 

pide explícitamente sub paquete :: método, ya sea en el árbol de herencia o No:

->Package::method() 

pide explícitamente la que se refiere a sub, ya sea en el árbol de herencia o no:

->$coderef() 

llama al método que han sido llamados por __PACKAGE__->method() si no hubiera un método secundario de __PACKAGE__ (NB la clase o el objeto a la izquierda del -> es irrelevante):

->SUPER::method() 

Cualquiera de los anteriores, dependiendo de los contenidos de $method:.

->$method() 

(Legal incluso bajo use strict;)

Si bien la primera forma es la más común, vale la pena aprender sobre los demás y cómo funcionan.

13

En resumen, SUPER no es un método. Es un paquete virtual. Está documentado en perlobj en la sección "Invocación de método".

Tenga en cuenta, sin embargo, que SUPER se basa en el paquete actual, no en el paquete de la instancia con la que lo utilizó.

Cuestiones relacionadas