|
Модераторы: korob2001, ginnie |
|
tishaishii |
|
|||
Создатель Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Не знаю, на каком языке ты говоришь, Nab, но множественное наследование - вполне ясная вещьчь: кто последний, тот и прав.
|
|||
|
||||
Zuzu |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Т.е. ты утверждаешь, что если есть метод m1() в классе Father и Mather, Child - их наследник (от Father Mother), то выполнится код от Mother? Или приведенный ниже код выдаст результат "M1 from Mother", так?
Ты заблуждаешься! В перле - другие правила поиска методов. Описаны правила, в частности, в Cookbook. Будет "M1 from Father". Или в записи use base qw/Father Mother/ ты считаешь Father последним? Это сообщение отредактировал(а) Zuzu - 7.2.2007, 09:49 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
tishaishii |
|
|||
Создатель Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Я ту книжку частично для справки читал, а лучше читать художественную литературу или газету иногда, а языком программирования надо пользоваться. Ну я в параметры base::import в Child местами попереставлял, получил, что работает "кто первый, тот и прав". Ну так и что же в этом мудрёного? |
|||
|
||||
Zuzu |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
tishaishii. То, что я описал - очевидно. И следует непосредственно из оригинальной документации по Perl. Там написано все очень четко.
Правило "Кто первый, тот и прав" - тоже не катит. Ниже - простейший код. Какой метод m1 снаследует Child в этом случае? По твоему предположению - выходит от Mother - это неверно.
Спросишь, к чему это я? Во-первых, лично я привык понимать, что делает программа без ее запуска на выполнение. Очень часто это спасало, когда нужно было быстро исправить ошибку на "живом" проекте, который реально работает. А на "исправление по всем правилам" - перенос всего кода и данных на площадку поддержки, исправление и отладка там, перенос отлаженного кода обратно на "реальный проект" - просто заказчик не дает времени. А во-вторых, просто хочется увидеть код твоего класса с геттерами-сеттерами через tie для моей простейшей модели с множественным наследованием. Той, что я рисовал в виде диаграмки. Я свой код написал прямо в форум буквально за пару минут. Это сообщение отредактировал(а) Zuzu - 8.2.2007, 10:56 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
Zuzu |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Nab, я посмотрел lvalue применительно к методам класса (как к setter'ам для свойств объекта). Мне не понравилось. Ожидал чуда, а они работают именно как lvalue Т.е. меняют значение переменной, указанной в return процедуры.
Соответсвенно, никакой радости в виде проверки корректности данных (внутри процедуры-метода) мы не получаем - работаем-то внутри процедуры со старыми, предыдущими значениями. Короче, скорее всего, использовать не буду. Смысла не вижу. Несколько сумбурно получилось. Если что непонятно написал - говори, приведу пример кода. Это сообщение отредактировал(а) Zuzu - 8.2.2007, 12:01 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
nitr |
|
||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Zuzu, я думаю тут видно...
тут первый Father меняем и получаем )
tishaishii, прав с этим правилом ;) |
||||||||
|
|||||||||
Zuzu |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
nitr, вопрос был не в том, как сделать, чтобы вызвался "M1 form Mother", а в том, какой метод реально вызовется без внесения изменения в код.
Если (для моего последнего примера кода) пользоваться правилом "Кто первый, то прав", должет вызваться "M1 from Mother", а это не так. Думаю, не открою тайну, если скажу, что результат будет "M1 from Class" т.е. Child при такой записи наследует метод от своего "самого базового" класса. Это, с какой-то стороны, логично, но без прочтения документации неочевидно. Это сообщение отредактировал(а) Zuzu - 8.2.2007, 12:17 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
Zuzu |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Все, до меня наконец-то дошло, почему концептуально все работает именно так.
tishaishii, ты абсолютно прав! Работает правило "Кто первый тот и прав". Все абсолютно логично. Просто нужно рассматривать классы, как некую "конечную сущность". Действует правило, аналогичное правилу написния UML-диаграмм, которое, если просто, гласит: что если чего-то не написано, это еще не значит, что его нет. В моем примере у класса Father уже есть метод m1(), несмотря, на то, что в самом классе его нет. Father его снаследовал от Class! По правилу "Кто первый, тот и прав" - первый Father. У него есть снаследованный метод m1(). Именно он и наследуется. Это сообщение отредактировал(а) Zuzu - 8.2.2007, 12:48 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
Nab |
|
|||
Опытный Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
приводи -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
Zuzu |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Nab, пример кода с lvalue
Результат:
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
Nab |
|
|||
Опытный Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Стыдно мне, таки нифига оно не работает
Плохо проверял однако И не до конца разобрался Приношу всем извенения, за то что ввел в заблуждение народ.... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
Shaggie |
|
|||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Zuzu, по-моему, то как раз то, чего можно ожидать от использования lvalue. WYSIWYG кажется это называется... Nab, за что извиняешься? Мне вот кажется, что ты прав. |
|||
|
||||
Zuzu |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Shaggie, я ожидал от lvalue чуда в том смысле, что надеялся, что оно сначала (грубо говоря, перед первой строкой кода процедуры) присвоит значение переменной, а уже внутри процедуры-метода можно будет использоваться именно это, новое значение. По аналогии с передачей параметров внутрь процедуры.
При проверке выяснилось, что не так (см. пример кода). Это сообщение отредактировал(а) Zuzu - 9.2.2007, 10:58 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
tishaishii |
|
|||
Создатель Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Т.е. ты нарочно схимичил и не переписал метод m1 для Father, чтобы с первого взгляда казалось, что вызывается не Father::m1, а Class::m1? Не получилось у тебя запутать:)))
И чего такого "чудесного" от lvalue ты ожидал? Механизм как механизм, а ты ждал "чудесный" механизм? Ну и используй значение, кто не даёт? Вобщем, что-то мне уже эта тема надоела, в основном приходится доказывать, что 1=1, а 0=0 - тавтология. Это сообщение отредактировал(а) tishaishii - 11.2.2007, 08:30 |
|||
|
||||
Shaggie |
|
||||||||||||||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Мои пять копеек.
Zuzu где-то отметил трудности с созданием закрытых методов класса (по типу private). Рискуя изобрести очередную вариацию велосипеда, я все же решился провести некоторые опыты и на личном примере убедиться в истинности либо ложности данного утверждения. Для примера Zuzu предлагал создать класс Кошка и объявить в нем метод Говорить... Ок, так и поступим.
У нас есть кошка Тася, которая говорит "Мяу". Вопрос - метод закрытый? Ну, как сказать... Например, имеет силу такой вот код:
То есть объект не создан, память не выделена. Мяукает какая-то совсем другая кошка, не та, которую я позвал... Была недавно тема о том, как определить, объект ли передан в функцию. Самый простой способ:
И теперь некая безымянная кошка мяукать не может. Однако... say - это просто функция по большому счету. То есть имеет смысл такой вот код:
И если не будет той проверочной строчки в say, то любой волк в кошачьей шкуре сможет сказать "Мяу". А теперь вылезает ошибка, так как параметры в функцию не передаются, и shift ругается на unitialized value. Исправляем:
И только потом до меня дошло, что проверка на "=" сработает на ЛЮБОМ объекте, передаваемом в функцию! Для проверки я создал пакет Dog, в нем метод call, совершенно аналогичный такому же в Cat. И теперь:
И пес Пират мяукает по-кошачьи! Прелестно... но надо править.
Вот это получилось похоже на закрытый метод. Как видим, в Перл возможность создания закрытого метода класса не поддерживается на уровне языка, но легко осуществляется его же возможностями. Это мой первый опыт объектного программирования в Перл, поэтому просьба комментировать если оказался не прав. И наверняка существуют модули под это дело... |
||||||||||||||
|
|||||||||||||||
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |