2009-09-06 11 views
13

Zauważyłem, że podczas wywoływania metody nadklasy jest, trzeba zrobić coś takiego:Dlaczego perl's SUPER call nie używa metody arrow?

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

Dlaczego nie jest to, że:

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

Geo, jeśli chcesz poznać drobiazgowe szczegóły przedmiotów w perlu, podnieś kopię Damiana Conwaya Object Oriented Perl http://www.manning.com/conway/ To bardzo szczegółowo opisuje różne sposoby użyj funkcji Perop OOP. Ma wszystko, od podstawowych błogosławionych skrótów do generowania dynamicznych metod, aż po błogosławione coderefs z egzotyki. To bardzo dobrze napisana książka. Ale także sprawdź Moose. Dla wielu, jeśli nie dla większości rzeczy, Moose jest właściwym sposobem na zrobienie Perl OOP. – daotoad

Odpowiedz

14

podejrzewam ponieważ $class->SUPER->new() zwykle taka sama jak $class->SUPER()->new(). Ale nie ma funkcji $class->SUPER() i nie jest jasne, co by to powróciło.

Z drugiej strony, $class->Foo::Bar zawsze był prawidłowym sposobem wywoływania metody bezpośrednio po imieniu, tak więc wykonanie specjalnej rzeczy w opakowaniu - SUPER - pasuje lepiej. (Podejrzewam, że może faktycznie realizować SUPER jako pakiet, a może to było w przeszłości, nie wiem)

PS: Spójrz na opakowaniu mro i $self->next::method. Przyjrzyj się także Moose, jeśli zamierzasz poważnie pracować w Perlu.

+9

Chcę zrozumieć rzeczy, zanim będę używał Łosia. – Geo

+3

Zapoznaj się z _A Delikatny wstęp do Moose_ http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html –

+2

@Geo, Tylko ty * myślisz * chcesz wiedzieć więcej. Mogę szczerze powiedzieć, że lepiej nie wiedzieć o tym, dopóki się z tym nie spotkasz. –

7

Aby dodać do tego, co derobert powiedział:

Dzwonisz „nowy” w przestrzeni nazw „Super” ale przekazując mu obiekt (lub ciąg znaków), „$ class”.

Nie mieć używać SUPER, jak można podać pełną nazwę pakietu rodzica (przydatne w przypadku diamentu dziedziczenia):

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

Inne ciekawostki: Właściwie możesz zrobić '$ self-> TotallyUnrelatedClass :: init()', ale prawdopodobnie lepiej tego nie robić! – derobert

13

wywołuje metodę mieć różne formy:

wywołuje metodę, ewentualnie dziedziczone:

->method() 

Wyraźnie zwraca sub Pakiet :: metodę, czy to w drzewie dziedziczenia lub nie:

->Package::method() 

Jawnie nazywa mowa-sub, czy to w drzewie dziedziczenia czy nie:

->$coderef() 

wywołuje metodę, która byłaby wywoływana przez __PACKAGE__->method() gdyby nie metoda sub w __PACKAGE__ (NB klasa lub obiekt po lewej -> ma znaczenia):

->SUPER::method() 

Każda z wyżej wymienionych, w zależności od zawartości $method.

->$method() 

(prawny nawet pod use strict;)

Podczas gdy pierwsza forma jest najczęstsza, warto dowiedzieć się o innych i o tym, jak działają.

13

W skrócie, SUPER nie jest metodą. To wirtualny pakiet. Jest to udokumentowane w perlobj w sekcji "Wywołanie metody".

Należy jednak zauważyć, że SUPER opiera się na bieżącym pakiecie, a nie na pakiecie instancji, z którego go używałeś.

Powiązane problemy