Vererbung klappt manchmal nicht

11/08/2010 - 19:12 von K. Wittrock | Report spam
Hallo NG,

ich habe mich endlich dazu aufgerafft, auch mal eine Klasse zu
programmieren. Dabei stand das Package main am Ende der Datei. Alles
lief prima. Dann verschob ich das Package main an den Anfang der Datei
- sonst keine Änderung. Und nichts ging mehr. Fehlermeldung: Can't
locate object method "new" via package "Row" at
U:\Klaus\Perl\Sudoku-Trainer\debug_move.pl line 40. In diesem Zustand
füge ich die (auf das Notwendige gekürzte) Datei unten an.

Zur Erlàuterung: Es werden keine Objekte der Klasse Unit erzeugt. Diese
stellt ihren Subklassen einige Methoden bereit.

perl -v ==>
This is perl, v5.10.1 built for MSWin32-x86-multi-thread
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2009, Larry Wall

Binary build 1007 [291969] provided by ActiveState
http://www.ActiveState.com
Built Jan 26 2010 23:15:11
[]

Ich habe das Package main schnell wieder ans Ende gestellt, hàtte aber
doch gern gewusst, was hier los ist. Wer hilft mir auf die Sprünge?

Gruß

Klaus


use strict;
use warnings;

# globals
my @rows; # row objects

package main;
use strict;
use warnings;

{ # main
foreach my $idx (1 .. 3) {
$rows[$idx] = Row->new($idx);
print 'object name is ', $rows[$idx]->{Name}, "";
}
}

package Unit;
use strict;
use warnings;

sub new { # constructor for unit objects
my $class = shift;

my $self = {};
print "in package Unit: create object of class $class";
return bless $self, $class;
}

package Row;
use strict;
use warnings;

our @ISA = qw/Unit/;

sub new { # constructor for row objects
my $class = shift;
my $idx = shift; # row index

my $self = $class->SUPER::new; ### line 40 ###
$self->{Name} = "row$idx";
return $self; # blessed in SUPER::new
}

Meine Email-Adr. lautet
K<ohne_Punkt_und_Komma>Wittrock<Klammeraffe>web.de
 

Lesen sie die antworten

#1 Peter J. Holzer
12/08/2010 - 17:47 | Warnen spam
On 2010-08-11 17:12, K Wittrock wrote:
ich habe mich endlich dazu aufgerafft, auch mal eine Klasse zu
programmieren. Dabei stand das Package main am Ende der Datei. Alles
lief prima. Dann verschob ich das Package main an den Anfang der Datei
- sonst keine Änderung.



Gewöhn Dir gleich von Anfang an an, jedes Package in ein eigenes
.pm-File zu schreiben. Macht die Dinge viel übersichtlicher und erspart
Dir solche Hoppalas.

Und nichts ging mehr. Fehlermeldung: Can't
locate object method "new" via package "Row" at
U:\Klaus\Perl\Sudoku-Trainer\debug_move.pl line 40.



Die Meldung ist etwas irreführend. In Zeile 40 versucht er ja nicht
Row->new aufzurufen, sondern Row->SUPER::new.

Aber damit ist es klar:

Folgender Code wird nach dem Compilieren ausgeführt:

my @rows; # row objects

package main;

{ # main
foreach my $idx (1 .. 3) {
$rows[$idx] = Row->new($idx);
print 'object name is ', $rows[$idx]->{Name}, "";
}
}

package Unit;

package Row;

our @ISA = qw/Unit/;




zu „our @ISA = qw/Unit/“ kommt er erst nach der Schleife. Die Schleife
ruft aber Row->new() auf, und in Row->new() sollte Row->SUPER::new()
aufgerufen werden. Dafür wird aber @ISA benötigt.

hp

Ähnliche fragen