есть много классов!
как наследовать конструктор perl?
>есть много классов!
>как наследовать конструктор perl?или точнее: нужно унаследовать констурктор, желательно. И самое главное вызвать (унаследовать) анонимно (чтобы не вызывать их, так как не удобно инициализировать в 10-30 строк 10-30 методов) другие методы с других классов?
через SUPER и can() не получилось
не работает
package sfsd;
use base 'config';sub new {
# $self->new if $self->can("new");
my $self = shift;
$self = SUPER::new(@_);
return $self;
}
1;
Судя по my $self = shift; вы неверно понимаете особенности конструкторов в перле. Почитайте таки туториал, ЕМНИП там есть часть написанная для полных чайников никогда не слышавших даже про ООП.
>Судя по my $self = shift; вы неверно понимаете особенности конструкторов в
>перле. Почитайте таки туториал, ЕМНИП там есть часть написанная для полных
>чайников никогда не слышавших даже про ООП.это я просто так написал пример, я пробовал по разному и этот тоже
я нигде не нашел как унаследовать конструктор... нигде нету
Вы не знаете английский или таки лень прочесть man perltooc?Ну ладно, небольшой демонстрационный пример для понимания простых методов создания и наследования объектов:
#!/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;Обратите внимание, что первый параметр конструктора это срока с именем класса, а вот у методов класса первым параметром будет ссылка на объект(экземпляр класса).
>Вы не знаете английский или таки лень прочесть man perltooc?иским проблемы есть, про man perltooc раньше никогда не слышал (в книгах и в статьях не видел), знаю есть man perltoot...
санглийский проблемы есть
На русский переведены два хороших учебника по перлу, так называемые lama book(http://en.wikipedia.org/wiki/Learning_Perl) и alpaca book(http://en.wikipedia.org/wiki/Intermediate_Perl). Во второй как раз хорошо описаны ссылки и объекты. Обе книги несложно найти в сети, так что от прямых ссылок воздержусь.С конструкторами и наследованием разобрались?
>На русский переведены два хороших учебника по перлу, так называемые lama book(http://en.wikipedia.org/wiki/Learning_Perl)
>и alpaca book(http://en.wikipedia.org/wiki/Intermediate_Perl). Во второй как раз хорошо описаны ссылки и
>объекты. Обе книги несложно найти в сети, так что от прямых
>ссылок воздержусь.
>
>С конструкторами и наследованием разобрались?первый
package func;use strict;
use CGI::Carp qw(fatalsToBrowser);
use DBI;
#use HTML::Template;
#use POSIX qw(ceil floor);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 listadmin;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
}
если даже и работает, то в пакете package listadmin все методы не видны
>если даже и работает, то в пакете package listadmin все методы не
>виднызабыл сказать:
в данном случае я явно не правильно написал, но пробовал по разному
сделал, что бы работало надо так:в класе который работает%
bless $self, $class;
а вот там где наследуем:
my $self = shift->SUPER::new(@_);