Как то создать объект одного класса, что то в нем поменять, а потом создать объект другого класса, который унаследует все функции и переменные (с измененными значениями) первого класса?Что то типа этого:
---------------------------------------
[host]$ cat script.pl
#!/usr/bin/perl## объект первого класса
my $obj = FIRST->new;
$obj->func1( 'test' );# объект второго класса
$obj = SECOND->new( $obj );
print $obj->func2, "\n";######### первый класс
package FIRST;sub new {
my $class = shift;
my $self = {};
bless($self, $class);
return $self;
}sub func1 {
my $self = shift;
my $var = shift;
$self->{var} = $var;
}sub func2 {
my $self = shift;
perurn $self->{var};
}######### второй класс
package SECOND;sub new {
my $class = shift;
my $self = shift;
bless($self, $class);
return $self;
}
---------------------------------------результат:
Can't locate object method "func2" via package "SECOND" at ./script.pl line 9.
для начала кусок из man perlobj
1. An object is simply a reference that happens to know which class it belongs to.
2. A class is simply a package that happens to provide methods to deal with object references.
3. A method is simply a subroutine that expects an object reference (or a package name, for class methods) as the first argument.
В принципе этих трех строк достаточно, чтобы понять основные моменты с классами в перле. Остается только добавить магию @ISA, use base, ну и AUTOLOAD.В вашем примере SECOND::new переопределяет тип ссылки. Совершенно не важно подать ли ему udefined scalar, arrayref или ref на какой-либо класс. После bless сама ссылка останется неизменной, но вот ее тип будет уже SECOND, про то что это было FIRST информации не остается. Ну а сам SECOND:: ничего кроме new не предоставляет, так что ошибка вполне закономерна.
Если вам нужно наследование, то используйте use base или напрямую изменяйте @ISA, хотя лучше все-таки use base.
Итого вам нужно после package SECOND; добавить
use base 'FIRST';В таком случае вы получите вызов func2. Однако такая практика является дурным тоном и крайне не рекомендуется.
Спасибо! Разобрался.Интересно, а почему такой способ считается плохим?
Где тут подводные камни?
>Интересно, а почему такой способ считается плохим?
>Где тут подводные камни?Например старый класс в курсе как освободить циклические ссылки, а новый нет - получаем утечку памяти. И вообще когда возникает такая необходимость это значит что классы плохо спланированы, в качестве аналогии можно привести использование goto в C/Pascal.