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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множественное наследование 
:(
    Опции темы
Vaneska
Дата 19.10.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: нет
Всего: 4



Приветствую.

Разбираюсь тут со всеми хитростями ООП.
Возник вопрос:
Код

# есть класс родитель
package First;
{
  sub new {
     my $self = shift;
     return bless({}, $self);
  }
}

# есть потомок
package First::Second;
{
  use base ("First");

  sub func1 {
     my $self = shift;
     return "func1";
  }
}

# двойное наследование
package First::FirstSecond;
{
  use base ("First");
  use base ("First::Second");

  sub func2 {
     my $self = shift;
     return "func2";
  }
}

Можно ли делать делать двойное наследование, если предок один?
Я вроде так сделал, никаких проблем вроде не было.
Но всетаки есть сомнения. Ведь получается класс FirstSecond наследует один и тот же метод new 2 раза.

Это сообщение отредактировал(а) Vaneska - 19.10.2005, 23:31
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
sharq
Дата 20.10.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



Он не наследывает два раза, просто new перекрывается.


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 20.10.2005, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата

Но всетаки есть сомнения. Ведь получается класс FirstSecond наследует один и тот же метод new 2 раза.

Прочь сомнения. smile
Когда ты вызываешь какой либо метод, Perl пытается сначала найти его в текущем пакете. Если ему это не удалось, то он проверяет массив @ISA по порядку и сначала вглубь. Это значит, если у нас какой либо класс является дочерним для нескольких родительских классов:
Код

push( @ISA, "First", "Second", "Third" );

То сначала Perl будет искать метод, который ему не удалось найти в текущем пакете в родительском классе First, если и там его не окажется, то он проверит массив @ISA класса First. Если у класса First найден родитель, то следующим шагом будет поиск в его родителях и так до тех пор, пока у одного из родительских классов для класса First не будет найден предок. Если ему так и не удалось найти вызываемый метод, он возвращается в текущий пакет и проверяет следующего родителя, в данном случае, класс Second и точно так же, снача вглубь. Будет вызван тот метод new, который будет быстрее всего найден.

Потому и происходит так-называемое перекрытие, все методы текщего пакета перекрывают методы родителей, методы первого родителя перекрывают, методы следующего родителя и т.д. Если же нужно унаследовать какой-либо метод и просто добавить ему чего-нить нового, то можешь определить его в своём классе, а затем обратиться к этому методу из родительского класса.
Код

sub hello {
       my $self = shift;
       my $name = shift || "Anonim";
       $self->SUPER::hello( $name );
}

А вот этот метод в родителе:
Код

sub hello {
       my $self = shift;
       print ( shift );
}


Это сообщение отредактировал(а) korob2001 - 20.10.2005, 22:31


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 21.10.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: нет
Всего: 4



Большое спасибо!
korob2001, тебе как всегда почет и уважение!

--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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