Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как наследовать конструктор 
V
    Опции темы
gcc
Дата 13.1.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Уважаемые, подскажите как унаследовать конструктор?

или как тут надо?
конструктор у наследника нужно написать примерно так:

Код

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;



Это сообщение отредактировал(а) gcc - 13.1.2009, 19:57
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 13.1.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, почему у Вас в func

Код

bless $self;


т.е. почему не указан класс? Кроме того, в child не должно быть

Код

bless $self;


P.S. Для создания конструктора класса-потомка мне нравится вариант

Код

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


Это сообщение отредактировал(а) ginnie - 13.1.2009, 20:03


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 13.1.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(ginnie @ 13.1.2009,  19:59)
gcc, почему у Вас в func

Код

bless $self;


так работает, по примеру, а как должно быть?
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 13.1.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, например так

Код

sub new {
    my ( $class, %common ) = @_;
    my $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, $class;
    return $self;
}



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 13.1.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(ginnie @ 13.1.2009,  19:59)
Кроме того, в child не должно быть

Код

bless $self;


там bless нету, там есть то что Вы подсказали
или еще то, что пробовал:
Код

sub new {
  shift->SUPER::new(@_);
}


Добавлено @ 20:08
ginnie,  сейчас попробую:

Код

    bless $self, $class;


Это сообщение отредактировал(а) gcc - 13.1.2009, 20:09
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 13.1.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Судя по коду, Вы что-то не понимаете. Если что-то не понятно - надо спрашивать!


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 13.1.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(ginnie @ 13.1.2009,  20:09)
Судя по коду, Вы что-то не понимаете. Если что-то не понятно - надо спрашивать!

если работает - значит правильно?  smile 

я нашел примеры и сделал так  как там, ну или добавил в конструктор еще, например, инициализацию подключения к DBI через can()... (мне там так удобно)

Это сообщение отредактировал(а) gcc - 13.1.2009, 20:13
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 13.1.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, как совместить Вашу мысль

Цитата(gcc @  13.1.2009,  20:12 Найти цитируемый пост)
если работает - значит правильно?


с

Цитата

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

если даже и работает, то в пакете package child (в котором наследуем) все методы не видны (пишет что не извеный метод)





--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 13.1.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



ginnie,  ну я имел ввиду что до этого

вот я изменил:

наследник:
Код

package child;

use strict;
use CGI::Carp qw(fatalsToBrowser);
use base 'func';

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


в child ошибка
Код

Undefined subroutine &SUPER::new called at line 24.

на эту тсроку ругается
Код

    my $self = SUPER::new(@_);




родитель:
Код

package func;

use strict;
use CGI::Carp qw(fatalsToBrowser);
use DBI;

#use HTML::Template;
#use POSIX qw(ceil floor);

sub new {

    my ( $class, %common ) = @_;
    my $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, $class;

    return $self;
}


догадываюсь, что конструктор по другому надо построить?...

Это сообщение отредактировал(а) gcc - 13.1.2009, 20:30
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 13.1.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, в соответствии с документацией вариант SUPER::new(@_) неправильный, поэтому попробуйте
Код

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




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 13.1.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



спасибо, заработало, я этот вариант тоже пробовал, но он не работал раньше...

возможно потому-что не было:
Код

    bless $self, $class;


сейчас вроде бы работает
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 14.1.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, вариант

Код

bless $self;


делает $self объектом текущего класса, поэтому она неверно работает при вызове из дочернего класса, т.к. создает объект класса-родителя, а не потомка (поэтому недоступны методы класса-потомка). Вариант

Код

bless $self, $class;


создает объект того класса, который передается параметром (класса-потомка в нашем случае).

Это сообщение отредактировал(а) ginnie - 14.1.2009, 12:17


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.