Автор Тема: Наследования в Perl  (Прочитано 5093 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн washington

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Наследования в Perl
« : 18 Апреля 2005, 00:12:15 »
Здравствуйте.
У меня токая проблемка.
Имеется два модуля.
person.pm и employee.pm – последний должен унаследовать все свойство и методы первого. Оба они лежат в папке info.
----------------------------------------------------------
package person;
sub new
{
    my $class=shift;
    my $self={};
    return bless($self, $class);
}
sub name
{
    my $self=shift;
    $self->{NAME}=shift if @_;
    return $self->{NAME};
}
sub age
{
    my $self=shift;
    $self->{AGE}=shift if @_;
    return $self->{AGE};
}
1;
----------------------------------------------------------
package employee;
use person;
@ISA=("person");
1;
----------------------------------------------------------
#!/usr/bin/perl -w

use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);

use info::employee;    - после этой строчки
появляется ошибка
[Sun Apr 17 22:16:52 2005] DzTemp.pl: Compilation failed in require at start.pl line 6.
[Sun Apr 17 22:17:17 2005] DzTemp.pl: BEGIN failed--compilation aborted at start.pl line 6.

Мучаюсь уже второй день. Может быть кто подскажет как решить эту проблему.
Спасибо.

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Наследования в Perl
« Ответ #1 : 18 Апреля 2005, 02:53:49 »
1. впиши use strict в каждый модуль и в стартовый скрипт
2. называй модули так же, как ты собираешься их вызывать (info::employee != employee). Ответ на вопрос почему есть практически в любой книжке по Perl.
3. в Perl возможно лишь наследования методов
0 OK, 0:1

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Наследования в Perl
« Ответ #2 : 18 Апреля 2005, 09:59:59 »
Да и не совсем понятен смысл такого применения? использовать модуль через другой модуль? Только замедлять исполнение конечного скрипта.
Ворота в perl - perlmonks.org.ru

Оффлайн washington

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Наследования в Perl
« Ответ #3 : 18 Апреля 2005, 12:35:17 »
Здравствуйте.
Благодарю за интерес к моей теме.
Что-то не выходит.
Если вызывать сразу модуль  person.pm из start.pl – то всё работает, а как только начинаю наследоваться в employee.pm говорит  Compilation failed in require at start.pl line 5.
А когда напрямую запускаю  employee.pm то там говорит Global symbol "@ISA" requires explicit package name at employee.pm line 6.

Вот код start.pl:
#!/usr/bin/perl -w
use strict;
use lib qw( info );
use info::employee;

info\\ employee.pm
package employee;
use strict;

use lib qw(.);
use person;
@ISA=("person");

1;

info\\ person.pm
package person;
use strict;
sub new
{
    my $class=shift;
    my $self={};
    return bless($self, $class);
}
sub name
{
    my $self=shift;
    $self->{NAME}=shift if @_;
    return $self->{NAME};
}
sub age
{
    my $self=shift;
    $self->{AGE}=shift if @_;
    return $self->{AGE};
}
1;

Может быть у вас есть какой ни будь рабочий пример -  может быть я что-то не дописываю где-то. washik@inbox.ru

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Наследования в Perl
« Ответ #4 : 18 Апреля 2005, 17:05:15 »
Глобальные относительно пакета переменные объявляются как
use vars qw( $var1 $var2 $var2 );
и начиная с Perl 5.005 есть более удобный способ записи
our $var1
our( $var2, $var3 );
0 OK, 0:1

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Наследования в Perl
« Ответ #5 : 18 Апреля 2005, 19:54:30 »
А в последних версиях перла есть еще более удобная конструкция для наследования:
use base qw(Class);
И не нужно никаких use vars, our и require =)
There Is More Than One Way To Do It (c)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28