Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Наследования в Perl


Автор: washington 17.4.2005, 23:08
Здравствуйте.
У меня токая проблемка.
Имеется два модуля.
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.

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

Автор: korob2001 18.4.2005, 02:03
В этот код:
Код

package employee;
use person;
@ISA=("person");
1;

Добавь такую строку:
Код

use lib qw( . );

Тоесть просто укажи где нужно искать модули и классы. Точка означает текущий каталог.
Код

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


Здесь сделай то же самое
Код

#!/usr/bin/perl -w
use lib qw( info );
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);

use employee;    - после этой строчки


ЗЫ: Пользуйся кнопкой "Код" для вставки и подсветки кода.

Удачи.

Автор: washington 18.4.2005, 11:16
Цитата(korob2001 @ 18.4.2005, 02:03)
В этот код:
Код

package employee;
use person;
@ISA=("person");
1;

Добавь такую строку:
Код

use lib qw( . );

Тоесть просто укажи где нужно искать модули и классы. Точка означает текущий каталог.
Код

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


Здесь сделай то же самое
Код

#!/usr/bin/perl -w
use lib qw( info );
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);

use employee;    - после этой строчки


ЗЫ: Пользуйся кнопкой "Код" для вставки и подсветки кода.

Удачи.

Здравствуйте.
Благодарю за интерес к моей теме.
Что-то не выходит.
Если вызывать сразу модуль 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;


Может быть у вас есть какой ни будь работающий пример - может быть я что-то не дописываю где-то.
[email protected]

Автор: korob2001 18.4.2005, 12:05
На вот тебе рабочий пример, называй классы и модули всегда с большой буквы, что бы в последствии не путать их с прагмами:

Класс Employee.pm
Код

package Employee;
use lib qw(.);
use Person;
push( @ISA, "Person" );
1;


Класс 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};
}

sub printed {
    my $class = shift;
    return("Hello, " . $class->{ NAME } . "! You are " . $class->{ AGE } . " old.");
}
1;


Ну и сам файл который подлючает класс Employee, который наследует все методы класса Person.
Файл test.pl
Код

#!/usr/bin/perl -w
use strict;
use lib qw( info );
use Employee;

my $person = new Employee;
$person->name('Denis');
$person->age(26);
print $person->printed();

Еще про ООП можешь почитать здесь:
http://forum.vingrad.ru/index.php?showtopic=43392&st=0&#entry334115

Удачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)