![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| gcc |
|
||||||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
объясните плиз как его использовать и для чего он нужен?
это для множественного наследования? http://search.cpan.org/~flora/NEXT-0.64/lib/NEXT.pm http://search.cpan.org/~flora/Class-C3-Ado...3/Adopt/NEXT.pm http://search.cpan.org/~flora/Class-C3-0.21/lib/Class/C3.pm что за чем должно идти? наприер NEXT.pm отличается не много от Class::C3::Adopt::NEXT
прчему тут не написали SUPER? NEXT ищет ближайщий методв a_method по наследованию?
maybe это класс? ACTUAL - это текущий класс? Это сообщение отредактировал(а) gcc - 22.7.2009, 02:59 |
||||||||
|
|||||||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
подскажите опять есть такой код:
maybe::next::method - это тоже самое что и NEXT::ACTUAL::yourmethodname() но что делает данный код и в чем разнциа между maybe::next::method(); и $self->next::method(); ? http://search.cpan.org/~flora/Class-C3-Ado...code_using_NEXT т.е. это деревовидное наследование в 2 ветки? Это сообщение отредактировал(а) gcc - 5.12.2009, 23:15 |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
Я, кстати, тоже присоединяюсь к вопросу чем NEXT лучше SUPER.
|
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Опять же, я не сильный любитель приемов ООП в перл, но рискну предположить...
"Обход дерева в глубину" Т.е. если super - вызывает метод только у текущего предка, то next - вызывает методы у всех предков по иерархии.. при множественном наследовании, по правилу "кто первый тот и прав", то использование next - позволяет вызвать все методы всех предков с аналогичным именем.. ну и всякое шаманство там в случае с ромбовидной иерархией, шоп метод одного и того же класса не вызывался дважды - distinct every - аналогичное, но только с правилом кто первый тот и прав, по-моему.... Кажется... смысл оного конечно лично мне мало понятен, ибо так на вскидку трудно предположить ситуацию в которой была бы необходимость вызывать все методы всех предков, а не только последний переопределенный. Да и я считаю, что такое написание - наследование в несколько уровней с переопределением, - не есть хороший тон.. уж если метод так актуален, вынеси его в отдельный абстрактный класс и юзай полиморфизм. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
P.S. Т.е. обход дерева в ширину
-------------------- менеджер по кодеврайтингу |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
а чем отличается $c->maybe::next::method(@_); от $c->next::method(@_); ?
не могу перевести с английского http://search.cpan.org/~flora/Class-C3-Ado...code_using_NEXT Добавлено @ 18:55 vadiml, там написано что лучше использовать next (Class::C3::Adopt::NEXT и аналогичные на Си), а не NEXT, так как линеризация происхоит медленно если много классов в большой программе а в чем разница между SUPER так и не понял... но в единственном случе пришлось использовать next в посте выше.... автор модуля Damian Conway в свой книге (perl OOP 2000г) писал про эту проблему с SUPER (книга 1200 страниц я пытался найти абзац где это написано, но не нашел), и в книге "Рецепты для профессионалоов" не помню какое издание, но там написано было что если множественное наследование, то надо как-то придумать с SUPER, чтобы вызвать только с какого-то класса... оно как бы не удобно.... по-моиму SUPER ищет слева на права в массиве @ISA, а NEXT справа на лево, или наоброт :( Это сообщение отредактировал(а) gcc - 26.12.2009, 03:26 |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Не знаю ))
То, что я написал и то лишь предположение, и может быть ошибочное как полностью, так и отчасти Тут надо брать один и тот же тест и проделать его с super, c next и смотреть разницу в поведении.. Иногда понять те или иные программистские решения бывает очень сложно -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Vaneska |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
Для super
Для next
В результате получаем: SUPER: D B A NEXT: D B C A С помощью NEXT мы выполняем все функции func в дереве наследовения слассов. А SUPER такого не делает. Получается, что NEXT - полноценная поддержка множественного наследования. --------------------
http://isokolov.blogspot.com/ |
||||
|
|||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Значит все же в ширину -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
Да. По идее должен 2 раза вызвать, но почему не вызвал, я не понял, а копаться не захотелось. Возможно сделали по умолчанию такое поведение. Ведь совершенно логично, что вызывать второй раз функцию, которая должна отработать только один раз не надо. В общем надо доку почитать и код посмотреть, сразу все ясно будет Это сообщение отредактировал(а) Vaneska - 28.12.2009, 18:29 --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
| Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
не, судя по всему, из того что я прочел на cpan'е, именно этот трабл с двойным вызовом одной и той же функции одного и того же экземпляра класса при ромбовидной иерархии - четко описывался и для обхода оного именно юзалась конструкция с DISTINCT http://search.cpan.org/~flora/NEXT-0.64/lib/NEXT.pm
а уж совсем устанавливать либу себе и в ней ковырятся действительно ниохота Это сообщение отредактировал(а) Bulat - 29.12.2009, 11:11 -------------------- менеджер по кодеврайтингу |
||||
|
|||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |