Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kalde funktion i kaldende klasse

2 views
Skip to first unread message

Morten P

unread,
Jun 15, 2009, 3:13:43 AM6/15/09
to
Jeg �nsker at kalde en log metode der findes i den klasse der har
instantieret en underklasse.
Der er ikke anvendt ISA og eksemplet nedenfor fejler.

Kan det l�ses p� en smart m�de?

package Top;

sub logger {
...
}

my $H = new Helpers()
$H->stuff();

...


package Helpers;

sub stuff {
my $self = shift;

# WRONG
$self->SUPER::logger('bla bla');
}


Peter Makholm

unread,
Jun 15, 2009, 5:13:14 AM6/15/09
to
"Morten P" <sp...@spam.spam> writes:

> Jeg ᅵnsker at kalde en log metode der findes i den klasse der har

> instantieret en underklasse.
> Der er ikke anvendt ISA og eksemplet nedenfor fejler.

Nᅵr du ikke 'anvender ISA' har du ikke et klassehierarki og det giver
derfor ikke mening at tale om SUPER.

> Kan det lᅵses pᅵ en smart mᅵde?

Jeg er ikke helt overbevist om at det overhovedet er smart. Men hvis
du det, kan det selvfᅵlgelig lade sig gᅵre. Enten kan du kalde logger
metoden i den klasse der har kaldt din stuff-metode:

caller->logger("yadda yadda yadda");

Ellers skal du gemme (caller)[0] i din konstruktᅵr:

package Helpers;

sub new {
my $class;
bless { master => (caller)[0] }, $class;
}

sub stuff {
my $self;

$self->{master}->logger("yadda yadda yadda");
}


> sub logger {
> ...
> }
>
> my $H = new Helpers()

Du bᅵr iᅵvrigt skrive 'Helpers->new()' istedet for ovenstᅵende, der
desvᅵre ikke er helt entydigt for perl parseren.

> $H->stuff();
>
> ...

//Makholm

Morten P

unread,
Jun 15, 2009, 8:49:23 AM6/15/09
to
> Jeg er ikke helt overbevist om at det overhovedet er smart

Det _er_ det heller ikke, men nogen gange kr�ver det at folk med mere viden
p�peger det s� man motiveres til et redesign :-)

Jeg g�r igang!

Tak for forslaget, jeg l�rte en del af det faktisk :-)


> Du b�r i�vrigt skrive 'Helpers->new()' istedet for ovenst�ende, der
> desv�re ikke er helt entydigt for perl parseren.

Hvilke problemer risikerer man at l�be ind i?

Er det "bare" at det tager l�ngere tid for den at gennemskue?


Peter Makholm

unread,
Jun 15, 2009, 9:35:04 AM6/15/09
to
"Morten P" <sp...@spam.spam> writes:

>> Jeg er ikke helt overbevist om at det overhovedet er smart
>

> Det _er_ det heller ikke, men nogen gange krᅵver det at folk med mere viden
> pᅵpeger det sᅵ man motiveres til et redesign :-)
>
> Jeg gᅵr igang!

Hvis det bare er for at finde den korrekte metde til log-beskeder, sᅵ
ville jeg faktorisere lognings-kode ud i sin egen klasse og sᅵ give et
sᅵdan objekt med ved instantiering af alle objekter. Det gᅵr det ogsᅵ
lettere hvis du pᅵ et tidspunkt har lyst til at skulle flere led op,
end bare 'klassen der har instantieret mig', men helt op til 'fᅵrste
klasse der har en holdning til logning'.

[ Re: 'new Helpers ();' ]

>> Du bᅵr iᅵvrigt skrive 'Helpers->new()' istedet for ovenstᅵende, der

>> desvᅵre ikke er helt entydigt for perl parseren.
>
> Hvilke problemer risikerer man at lᅵbe ind i?

Problemet er at perl vil foretrᅵkke allerede erklᅵret en new()
funktion fra det aktuelle namespace. Det vil sige at betydningen af
din kode kan ᅵndre sig hvis du flytter lidt rundt pᅵ dine
funktionserklᅵringer.

Se
http://books.google.com/books?id=yMMRnPQ7CSMC&pg=PA349&lpg=PA349&dq=perl+indirect+object+syntax&source=bl&ots=_j98eo7dLc&sig=T0uQmmAiaoh4EDsG78QcinLpBLs&hl=en&ei=N0s2StzvD8S0-Aac3aGhDQ&sa=X&oi=book_result&ct=result&resnum=8#PPA349,M1

//Makholm

Morten P

unread,
Jun 19, 2009, 5:29:56 PM6/19/09
to
>>> Du b�r i�vrigt skrive 'Helpers->new()' istedet for ovenst�ende, der
>>> desv�re ikke er helt entydigt for perl parseren.


Det var dog utroligt!
Jeg har default v�rdier i $self i new() i mine klasser.
Jeg fik warnings p� undef variabler, hvilket slet ikke gav mening.

Jeg instantierede klassen med:

my $C = new $class_name;

Vill for sjov teste med "din" syntaks:

my $C = $class_name->new();


Og s� fungerede det :-)

Jeg m� l�se op p� bless for jeg kunne anvende $self overalt i klassen selvom
new() aldrig var blevet k�rt og derfor ingen bless.

Endnu engang, tak :-)


0 new messages