/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Kalde funktion i kaldende klasse
Fra : Morten P


Dato : 15-06-09 08:14

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 (15-06-2009)
Kommentar
Fra : Peter Makholm


Dato : 15-06-09 10:13

"Morten P" <spam@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 (15-06-2009)
Kommentar
Fra : Morten P


Dato : 15-06-09 13:49

> 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 (15-06-2009)
Kommentar
Fra : Peter Makholm


Dato : 15-06-09 14:35

"Morten P" <spam@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

Søg
Reklame
Statistik
Spørgsmål : 177409
Tips : 31962
Nyheder : 719565
Indlæg : 6407779
Brugere : 218874

Månedens bedste
Årets bedste
Sidste års bedste