Philipp Hasenfratz: Vererbung OOP, ...

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;
}

Methoden

sub _read {
   # blablabla
}

  1. 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

    1. 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

      • Johannes
    2. 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

      1. 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