Vererbung OOP, ...
Philipp Hasenfratz
- perl
Hallihallo
Hab grad ein Verständnisproblem mit der Vererbung in OOP:
ich hab ein Basismodul und verschiedene Readermodule (deren Methoden auch durch
die Instanz des Basismoduls aufgerufen werden können sollen).
Wäre froh, wenn mir da jemand sagen könnte, was ich falsch mache.
Viele Grüsse
Philipp
------
also so:
<snip>
my $bla = new Bilanz::Storage;
my %read = $bla->_read;
</snip>
package Bilanz::Storage;
use strict;
use Bilanz::Event;
use Bilanz::Debug;
use vars qw(@ISA);
sub new {
my ($class, %params) = @_;
my $self = {};
bless ($self, $class);
my $storage = delete $params{-storage};
if ($storage eq 'txt') {
eval('use Bilanz::Storage::txt');
@ISA = ('Bilanz::Storage::txt');
$self = $class -> SUPER::new(%params);
} else {
eval('use Bilanz::Storage::sql');
@ISA = ('Bilanz::Storage::sql');
$self = $class -> SUPER::new(%params);
}
return $self;
}
und spezielle Readermodule für sql, txt, xml, ..., die in das Bilanz::Storage Modul
"eingelegt" werden sollen, sodass man über das Modul Bilanz::Storage auf die Methoden
von Bilanz::Storage::xxx zugreifen kann.
Hier ein Readermodul:
package Bilanz::Storage::txt;
use strict;
use Bilanz::Event;
use Bilanz::Debug;
sub new {
my ($class, %conf) = @_;
my $self = {};
bless ($self, $class);
$self->{Events} = new Bilanz::Event;
$self->{debug} = new Bilanz::Debug(-all => -1);
$self->{-file_konten} = $conf{-file_konten};
$self->{-file_transactions} = $conf{-file_transactions};
$self->{debug}->debug("init of $self");
$self->_read;
return $self;
}
sub _read {
# blablabla
}
Hallihallo nochmals:
also mein Problem ist einfach, dass die Methoden des Readers nicht in das Basismodul vererbt oder exportiert (oder wie auch immer man das nennen mag) werden. Es kommt immer die Fehlermeldung: Methode blablabla konnte irgendwie nicht in Basismodul gefunden werden, blabla...
Danke.
Philipp
Hallo Philipp,
ohne den Source jetzt gelesen zu haben (nur den Text drum rum):
Man kann aus einer Basisklasse keine Methoden der abgeleiteten Klassen aufrufen. Dies liegt ganz einfach daran, dass der Interpreter erst die abgeleitete Klasse einbinden muss. Diese bindet dann wieder die Basisklasse ein. Somit würden sich zwei Klassen endlos einbinden... da dies nicht möglich ist, ist auch ein gegenseitiges Einbinden nicht machbar.
cya
Hoi,
also mein Problem ist einfach, dass die Methoden des Readers nicht
in das Basismodul vererbt oder exportiert (oder wie auch immer man
das nennen mag) werden. Es kommt immer die Fehlermeldung: Methode
blablabla konnte irgendwie nicht in Basismodul gefunden werden,
blabla...
Ich denke, das liegt daran, dass du @ISA nicht direkt am Anfang setzt.
Als Alternative kannst du ja mal
use base qw(Modulname);
ausprobieren.
Gruesse,
CK
Hoi,
Ich denke, das liegt daran, dass du @ISA nicht direkt am Anfang
setzt. Als Alternative kannst du ja mal
use base qw(Modulname);
ausprobieren.
Ergaenzend: im OO-Style wuerde ich das jetzt so loesen, dass du eine
Klasse schreibst, die in jedem Fall abgeleitet werden *muss*. In der
setzt du dann das eindeutige @ISA:
package TXTReader;
use vars qw($VERSION @ISA);
@ISA = qw(Reader::Storage Reader::Storage::txt);
bzw.
package SQLReader;
use vars qw($VERSION @ISA);
@ISA = qw(Reader::Storage Reader::Storage::sql);
Gruesse,
CK