Schrift
[thread]11478[/thread]

Probleme bei Vererbung



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
tsy
 2008-03-17 18:11
#107143 #107143
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Hallo, ich habe ein Problem mit der Vererbung, wenn ich aus einer abgeleiteten Klasse den Konstroktor der Basisklasse aufrufen möchte.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
package Benutzer;

@ISA = ('Person');

use NET::ldap;
use strict;

sub new {
        my $class = shift;
        my ($id, $nachname, $vorname) = @_;
        $class->SUPER::new($id, $nachname, $vorname);
        [...]
}

Der Konstruktor kann in der Basisklasse nicht gefunden werden
Code: (dl )
Can't locate object method "new" via package "Benutzer"


Leider kann ich meinen Fehler nicht erkennen. Kann jemand helfen?

viele Grüße, tsy
Struppi
 2008-03-17 18:18
#107145 #107145
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wenn man den Code vollständig macht, funktioniert es Problemlos:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl -w
use strict;
 
package Person;

sub new {
        my $proto = shift;
        my $self = bless {}, ref $proto || $proto;
        print "Parameter: @_\n";
        return $self;
}

package Benutzer;
use base 'Person'; 
 
 sub new {
         my $class = shift;
         my ($id, $nachname, $vorname) = @_;
         $class->SUPER::new($id, $nachname, $vorname);

 }
package main;
new Benutzer(1, 'hinten', 'vorne' );
tsy
 2008-03-17 18:44
#107147 #107147
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Hallo, Struppi,
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Person;

use strict;
sub new {
        my $class = shift;
        my $self = bless {} , ref $class || $class;
        my ($id, $nachname, $vorname) = @_;

        $self->{'id'} = $id;
        $self->{'nachname'} = $nachname;
        $self->{'vorname'} = $vorname;
        
        #bless $self, ref $class || $class; # wegen Vererbung
        return $self;
}

führt leider bei mir exakt zur selben Fehlermeldung.
benutze ich anstatt ISA die use base-Anweisung im Benutzer, bekomme ich
Code: (dl )
Can't locate Person.pm in @INC

obwohl sich die Klasse im selben Verzeichnis befindet. Was habe ich denn noch übersehen?

Viele Grüße,

tsy
murphy
 2008-03-17 19:25
#107149 #107149
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
tsy+2008-03-17 17:44:36--
[...], bekomme ich
Code: (dl )
Can't locate Person.pm in @INC

obwohl sich die Klasse im selben Verzeichnis befindet. Was habe ich denn noch übersehen?
[...]


Das Verzeichnis, in dem Dein Skript liegt, ist nicht automatisch im Suchpfad für Module vertreten. Da fehlt Dir wahrscheinlich noch etwas wie
Code (perl): (dl )
1
2
use FindBin;
use lib $FindBin::RealBin;

When C++ is your hammer, every problem looks like your thumb.
tsy
 2008-03-18 11:30
#107170 #107170
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Hallo, da bin ich noch mal.
Wenn ich das richtig verstehe, dann liegt das Problem nicht im Skript selber, sondern bei den Modulen. Das Skript findet ja das Modul Benutzer, aber das Modul Benutzer nicht seine Basisklasse Person.

Ich möchte mein Projekt idealerweise folgender maßen organisieren:
Code: (dl )
1
2
3
4
5
6
7
8
main "root"-Verzeichnis
|
|---> Skripte.pl
|
|--->UserDomain
| |--->Person.pm
| |--->Benutzer.pm
| ... | ...


in meinen Skripten würde dann stehen z.B.
Code (perl): (dl )
1
2
use UserDomain::Benutzer;
[...]

und in den Modulen
Code (perl): (dl )
1
2
3
package UserDomain::Benutzer;
use Person;
use base 'Person';
Das funktioniert aber nicht. In @INC ist zwar . enthalten, aber ich bekomme
Code: (dl )
Can't locate Person.pm in @INC
mit dem Fehler bei
Code (perl): (dl )
use Person;
im Benutzer

Ich hoffe, das sind genug Informationen.
Ich habe so das Gefühl, dass ich irgendwas Grundlegendes vergessen oder nicht verstanden habe... :-/

Viele Grüße,
tsy
renee
 2008-03-18 11:33
#107171 #107171
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst entweder Person.pm um eine Ebene nach oben schieben, oder Du lässt es dort wo es ist und machst ein package UserDomain::Person; und dementsprechend use base 'UserDomain::Person'; (das ist zu bevorzugen). Das use vorher brauchst Du nicht.

"." ist zwar in @INC, aber das ist das Skript-Verzeichnis. Und damit wird Person.pm nicht gefunden.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
tsy
 2008-03-18 12:14
#107172 #107172
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Danke für die schnelle Erklärung.
Ich habe es jetzt dementsprechend geändert.
Dies führt mich aber wieder zu dem Problem
Code: (dl )
Can't locate object method "new" via package "Benutzer" (perhaps you forgot to load "Benutzer"?)
das sich ähnlich wie ganz oben anhört.
in meinem Skript steht zunächst nur
Code (perl): (dl )
1
2
3
use UserDomain::Benutzer;

$someone = new Benutzer ([parmeter]);

und im Benutzer
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
package UserDomain::Benutzer;
use base 'UserDomain::Person';

use NET::ldap;
use strict;

sub new {
        my $class = shift;
        my ($id, $nachname, $vorname) = @_;
        $class->SUPER::new($id, $nachname, $vorname);
        $class->{'letzterLogin'} = "";
        $class->{'berechtigung'} = 0;
}


Ich schätze, ich bin ein schwieriger Fall...

Gruß, tsy
renee
 2008-03-18 12:25
#107174 #107174
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst den kompletten Modulnamen verwenden. Also aus $someone = new Benutzer ([parmeter]); einfach $someone = new UserDomain::Benutzer ([parmeter]); machen.

Edit: Man sollte die indirekte Methodenaufrufe nicht verwenden - auch wenn man diese SSchreibweise aus Java und anderen Sprachen gewohnt ist.

Also besser $someone = UserDomain::Benutzer->new([parmeter]); schreiben.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
tsy
 2008-03-18 12:52
#107176 #107176
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Nun bin ich wieder bei meinem ersten Posting angelangt - er kann das new in der Klasse Person nicht finden! :-(
Code: (dl )
Can't locate object method "new" via package "UserDomain::Benutzer" at C:/[...]/UserDomain/Benutzer.pm line 11, <DATA> line 228.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package UserDomain::Benutzer;
#use base 'UserDomain::Person';

@ISA = qw(UserDomain::Person);
use NET::ldap;
use strict;

sub new {
        my $class = shift;
        my ($id, $nachname, $vorname) = @_;
        $class->SUPER::new($id, $nachname, $vorname);
        $class->{'letzterLogin'} = "";
        $class->{'berechtigung'} = 0;
}

wenn ich das Package direkt anspreche:
Code (perl): (dl )
$class->UserDomain::Person::new($id, $nachname, $vorname);

führt zu
Code: (dl )
Can't locate object method "new" via package "UserDomain::Person" (perhaps you forgot to load "UserDomain::Person"?) at C:/[...]UserDomain/Benutzer.pm line 11, <DATA> line 228.


--------------- noch mal die Ausgabe:
Can't locate object method "new" via package "UserDomain::Benutzer" at C:/[...]/UserDomain/Benutzer.pm line 11, <DATA> line 228.

Can't locate object method "new" via package "UserDomain::Person" (perhaps you forgot to load "UserDomain::Person"?) at C:/[...]UserDomain/Benutzer.pm line 11, <DATA> line 228.
renee
 2008-03-18 12:56
#107177 #107177
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Entweder Du benutzt use base ... und dann brauchst Du kein use UserDomain::Person oder Du benutzt our @ISA =qw(UserDomain::Person); aber dann brauchst Du use UserDomain::Person.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-03-17 18:11.