Уважаемые, подскажите как унаследовать конструктор?
или как тут надо? конструктор у наследника нужно написать примерно так:
| Код | use base 'func'; sub new { shift->SUPER::new(@_); }
|
| Код | sub new { my $self = SUPER::new(@_); $self->{text} = 'some text'; return $self; }
|
но он не работает, пробовал по разному...
если даже и работает, то в пакете package child (в котором наследуем) все методы не видны (пишет что не извеный метод)
то что делаю:
это класс родитель:
| Код | package func;
use strict; use CGI::Carp qw(fatalsToBrowser); use DBI;
sub new {
my ( $self, %common ) = @_; $self = { se => undef, session => undef, he => undef, p => undef, query => undef };
$self->{'se'} = $common{'se'} if $common{'se'}; $self->{'session'} = $common{'session'} if $common{'session'}; $self->{'he'} = $common{'he'} if $common{'he'}; $self->{p} = $common{p} if $common{p}; $self->{query} = $common{query} if $common{query};
# $self->{'passwd'} = $common{'passwd'} if $common{'passwd'};
if ( $common{passwd} ) { $self = &md5crypt( $self, $common{'passwd'} ); } bless $self; return $self; }
|
пытаюсь унаследовать: (то что не нужно - я вырезал)
| Код | package child;
use strict; use CGI::Carp qw(fatalsToBrowser); use Data::Validate::Domain qw(is_domain);
use base 'func';
sub new {
# print "Child::new @_\n"; # my $self = shift; # my ($data_p, $data_c)=@_; # my $self = shift; my ( %common ) = @_[1];
my $self->SUPER::new(@_[0]); # $self->{child_data}=$data_c; #return $self;
=sdf my ( $self, %common ) = @_; $self = { se => undef, session => undef, he => undef, p => undef, query => undef };
$self->{se} = $common{se} if $common{se}; $self->{session} = $common{session} if $common{session}; $self->{he} = $common{he} if $common{he}; $self->{p} = $common{p} if $common{p}; $self->{query} = $common{query} if $common{query}; bless $self; $self->dbi_connect if $self->can("dbi_connect"); return $self; =cut }
|
примерно как это должно выглядеть в конструкторе где передаються не именнованные параметры (в данном случаен не знаю как применить это)
| Код | #!/usr/bin/perl -w use strict; package Parent; sub new { print "Parent::new @_\n"; my $pkg=shift; my $data=shift; my $self={parent_data=>$data}; bless $self,$pkg; } sub echo { my $self=shift; print "$self->{parent_data}\n"; } package Child; use base 'Parent'; sub new { print "Child::new @_\n"; my $pkg=shift; my ($data_p, $data_c)=@_; my $self=$pkg->SUPER::new($data_p); $self->{child_data}=$data_c; return $self; } sub echo { my $self=shift; print "$self->{child_data}\t"; $self->SUPER::echo; }
package Main; my $a=Parent->new("a_p"); my $b=Child->new("b_p","b_c"); use Data::Dumper; print Dumper($a,$b); $a->echo; $b->echo;
|
|