[Bielefeld-pm] Package-Variablen bei Vererbung
Nils Diewald
nils at diewald-online.de
Mi Jan 5 07:57:55 PST 2011
Hallo!
Gestern diskutierten wir ein Perl-Problemchen, das mir Kopfzerbrechen
bereitete und das wir gestern auch nicht lösen konnten:
In einer Klasse wollte ich ein globales Array durch eine Basis-Klasse
(die nur get-set-Accessors bereitstellt) zur Verfügung stellen lassen,
das alle Methoden enthält, die durch die get-setter-Methoden
instantiiert wurden.
Soeben hat mir Jürgen (Danke!!!) die Lösung gemailt, die vermutlich zu
naheliegend war (ich hatte mit Closures in der Import-Methode gespielt,
etc.).
Das Script, das das Problem illustriert und die Lösung enthält, habe ich
beigefügt.
Hat mich allerdings auf ein neues Problem gestoßen: "use base '...'"
triggert nicht die "import"-Methode, die ich eigentlich zur
Zurücksetzung des Arrays missbrauchen wollte (z.B. beim Reloading des
Moduls in Mojolicious ...). In dem Fall ist ein Hash statt eines Arrays
wohl besser geeignet.
Beste Grüße,
Nils
-------------- nächster Teil --------------
#!/usr/bin/env perl
package Fundamental;
# Acessor-Klasse
use strict;
use warnings;
no warnings 'once';
sub new {
return bless {}, $_[0];
};
# Accessor-Methode:
sub get_set {
my ($class, $att) = @_;
my $code = <<SUBEND;
sub {
if (\@_ == 1) {
return \$_[0]->{'$att'}
if exists \$_[0]->{'$att'};
return undef;
};
\$_[0]->{'$att'} = \$_[1];
};
SUBEND
no strict 'refs';
*{"${class}::$att"} = eval $code;
# Juergens Loesung:
push(@{ "${class}::keys" }, $att);
};
package Car;
use base 'Fundamental';
__PACKAGE__->get_set('door');
__PACKAGE__->get_set('wheel');
sub rally_stripes { 'no' };
package House;
use base 'Fundamental';
__PACKAGE__->get_set('door');
__PACKAGE__->get_set('window');
sub garage { 1; };
package main;
use strict;
use feature 'say';
my $casa = House->new;
$casa->door(4);
say $casa->door;
say $casa->window; # Undef!
say 'House has ', join(', ', @House::keys);
say 'Car has ', join(', ', @Car::keys);
Mehr Informationen über die Mailingliste Bielefeld-pm