[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