The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Наследование"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Наследование"  
Сообщение от jr email(ok) on 10-Дек-07, 21:01 
Как то создать объект одного класса, что то в нем поменять, а потом создать объект другого класса, который унаследует все функции и переменные (с измененными значениями) первого класса?

Что то типа этого:
---------------------------------------
[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.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Наследование"  
Сообщение от angra (ok) on 10-Дек-07, 21:46 
для начала кусок из 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. Однако такая практика является дурным тоном и крайне не рекомендуется.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Наследование"  
Сообщение от jr email(ok) on 11-Дек-07, 09:52 
Спасибо! Разобрался.

Интересно, а почему такой способ считается плохим?
Где тут подводные камни?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Наследование"  
Сообщение от angra (ok) on 11-Дек-07, 18:58 
>Интересно, а почему такой способ считается плохим?
>Где тут подводные камни?

Например старый класс в курсе как освободить циклические ссылки, а новый нет - получаем утечку памяти. И вообще когда возникает такая необходимость это значит что классы плохо спланированы, в качестве аналогии можно привести использование goto в C/Pascal.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру