наследовать конструктор perl

Модератор: Модераторы разделов

Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

наследовать конструктор perl

Сообщение gcc »

первый

Код:

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


если даже и работает, то в пакете package child все методы не видны

примерно как это должно выглядеть в конструкторе где передаються не именнованные параметры

Код:

#!/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;
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: наследовать конструктор perl

Сообщение Portnov »

А в чём вопрос?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: наследовать конструктор perl

Сообщение gcc »

это класс родитель: (просто класс какой-то)

Код:

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


другой должен наследовать ( в данном случае хочу наследовать конструктор) (чтобы не писать одно и тоже)
конструктор у наследника нужно написать примерно так:

Код: Выделить всё

use base 'func';
sub new {
  shift->SUPER::new(@_);
}


или так

Код: Выделить всё

sub new {
    my $self = SUPER::new(@_);
    $self->{text} = 'some text';
    return $self;
}

но он не работает, пробовал по разному...

SUPER используется в случае, если Вам нужно из метода класса-наследника вызвать аналогичный метод класса-родителя. Например, если мы хотим сделать в create2 метод new(), расширяющий аналогичный метод класса create

UNIVERSAL это класс-родитель от которого неявно отнаследованы все другие классы, он содержит несколько общих для всех методов, например can(), который позволяет определить наличие определенного метода в классе.

ЗЫ наследовать конструктор как-то можно, в других языках что-то подобное есть
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: наследовать конструктор perl

Сообщение gcc »

что бы работало надо так:

Код: Выделить всё

    bless $self, $class;


Код: Выделить всё

    my $self = shift->SUPER::new(@_);
Спасибо сказали: