![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Вообщем-то раньше писал на яве, сейчас пишу на перле, но очень хочется порой писать по ООП'ному, просто так красивее и проще
Просмотрел ряд топиков, но все же... Хочется решить такую задачу: Есть класс, в нем инкапсулированные переменные класса, и методы getVariable1, getVariable2 и т.д., а также методы setVariable1, setVariable2 и т.д. Все переменные должны поступать через конструктор класса, т.е. методы setVariable1 и т.д. только для правки. Т.е. по сути дела класс - лишь контейнер для хранения данных. Далее каждый экземпляр класса должен хранится в массиве, и при необходимости получать ту или иную переменную через метод getVariableX, соотв. для этого он и задумывается Вообще видел один не плохой топик, однако то, что меня в нем не устроило, то, что там массив был внутри самого экземпляра класса. Мне же нужно чтоб класс был лишь "контейнером". Т.е. каждый экземпляр класса хранить по одному набору переменных объявленных в классе. А все экземпляры класса хранятся в массиве, скажем так основного скрипта. При прохождении данного массива обращаемся каждый раз к очередному экземпляру класса и работаем с переменными из данного экземпляра... Надеюсь понятно выразился... -------------------- менеджер по кодеврайтингу |
|||
|
||||
| korob2001 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ну насколько я понял, нужно что-то типа этого:
Есть класс Person, поля которого хранят имя, фамилию и возраст человека. Опишем его: Файл Person.pm
Теперь сохраним в тот же каталог, файл который будет использовать наш класс Person. Файл people.pl
Я для краткости, не стал использовать все методы, но ты если хочешь можешь опробовать и их, но тогда последний цикл тебе придётся заменить, так как в нём массив очищается, так как используется как стёк, т.е. вместо строки:
Вставь наример такую:
После этого цикла все объекты так и будут храниться в нашем массиве @people и будет возможность поэксперементировать с ним ещё. Например можно попробовать добавить каждому человеку не по одному году, а по 5 лет используя всё тот же метод addAge() но уже с одним параметром типа int.
Здесь параметры получаемые конструктором получились именованные, если же хочешь сделать так, как в Java, то в конструкторе используй анонимный массив вместо анонимного хеша. Но это так, простейший пример, если хочешь более подробно, то поищи в разделах по Perl, по ключевому слову "ООП" или "Объектно Ориентированное Программирование", а так же советую почитать книгу "Программирование на Perl", в ней автор языка более подробно описывает данную тему. Если знаком с Java, то думаю всё будет понятно. Это сообщение отредактировал(а) korob2001 - 1.10.2007, 21:06 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||
|
|||||||||||
| Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
korob2001, супер.... Это даже больше чем я ожидал...
Есть только пара вопросов, чтоб добить это
Я так понял, объявление переменных внутри класса, инкапсулирует их ??? И как бы так грамотнее выразится... $self и будет являтся экземпляром класса ??? И послдений пока вопрос:
немного напоминает объявление массива хэшэй, но суть вопроса не в этом.... Как правило в яве, вроде бы и в С++, в конструкторе мы пишем все входные параметры, а при создании очередного экземпляра класса, лишь пишем, допустим $name = "Вася" $family = "Пупкин" $age = 16 new Person($name, $family, $age) и тут главное соблюдат правильную последовательность переменных... При таком объявлении, возможно не соблюдение последовательности ??? Добавлено через 13 минут и 32 секунды Млин, прям все это так глаз радует, все эти старые геттеры и сеттеры, методы и классы, и все на перле..... Море восторга, и соотв... -------------------- менеджер по кодеврайтингу |
||||
|
|||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
М-дя, и в догонку очень важный вопрос о деструкторах... В яве-то их ручками писать не надо, а как насчет перла ??
-------------------- менеджер по кодеврайтингу |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Bulat, тоже самое "не надо", но это исходя из задачи. В данном примере - не нужен.
А korob2001 как всегда |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
nitr,
А хорошего ;) , ресурса про ООП в перле случаем нет... А то в рамках данного примера все гуд, вот только хотелось более полно догнать такие вещи как наследование, инкапсуляция и т.п. P.S. Ссылки на топики форума прошу не кидать, в целом почти все промсотрел, но хотелось бы более полного материала -------------------- менеджер по кодеврайтингу |
|||
|
||||
| cerf_machine |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.2.2007 Где: тебя носило? Репутация: 1 Всего: 1 |
Инкапсуляции в перле нет. Т.е. в представленном выше примере можно обращаться к "свойствам" "объекта" напрямую:
Наследование в перле не использовал, но знаю, что оно тоже, к сожалению, псевдо, как и перегрузка операторов:( Реализуется через подключение базового класса в @ISA дочернего.
Ага. Но на самом деле $self - ссылка на хэш, связанная (blessed) с текущим пакетом (Person). Свойства же - на самом деле - ключи хэша.
Да, возможно. Это сообщение отредактировал(а) cerf_machine - 2.10.2007, 14:41 |
||||||
|
|||||||
| korob2001 |
|
||||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Как сказал cerf_machine, инкапсуляция отсутсвует, как таковая, это философия Perl. Но, Perl позволяет сделать закрытость ещё более надёжную, чем другие языки программирования, разумеется, если это нужно. Например можно таким образом изменить класс Person, который я приводил выше.
Вот собственно мы и закрылись, теперь поля доступны только внутри файла Person.pm, т.е. мы получили private поля. Можно так же сделать и protected, ну или что-то похожее на protected поля в Java, если изменить условие в конструкторе:
на такое:
Т.е. напрямую к полям теперь можно будет обращаться только из текущего пакета или же из классов наследников. Можно так же реализовать и закрытые методы, опять же, если это нужно.
Абсолютно верно, потому использовать анонимный хеш гораздо удобнее, не следует думать о перегрузке конструктора. Если же хочешь создать аналог создания Java или C++ объекта, то вместо анонимного хеша используй анонимный массив: Вот так теперь будет выглядеть наш класс Person.pm
а вот программа, которая его использует:
Кстати, можно так же заюзать псевдо-хеш, хотя они сейчас помечены как depricated, но в Perl можно реализовать что-то похожее на псевдо-хеш вручную, а можно так же и не вручную, например заюзав прагму компилятора fields
В Perl сборка мусора происходит тоже автоматически, примерно так же, как и в Java, потому деструкторы нужно юзать, как сказал nitr, только в исключительных случаях. Это сообщение отредактировал(а) korob2001 - 2.10.2007, 20:09 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||||||||
|
|||||||||||||||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Кстати, ты говорил, что знаком с Java. Вот я тут как-то приводил пример того, как можно создавать классы Java на лету, прямо из Perl программы, а после этого создавать объекты в Perl программе и работать с ними, как с родными Perl объектами. Это работает примерно так же, как встроенный код Assembler'a в программу C++.
Вот здесь можешь посмотреть этот пример. Кстати, таким же макаром, можно встраивать в Perl программу и код на C++, Assembler, Basic, да и многих других языков и не только языков. Вобщем если будет интересно, то поищи модули на cpan.org, по ключевому слову "Inline". Если ты под виндой, то можешь просто набрать в командной строке, такую команду: C:\>ppm s Inline Получишь список модулей, для встраивания кода других языков в Perl программу. Что бы установить модуль дай команду: C:\>ppm i Inline-Java Или другое имя модуля, вместо Inline-Java. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
korob2001, ну инкапсуляция перемнных в классе-контейнере, вообще очень важна, так как если в ходе работы программы у нас создается не один экземпляр класса, то потом при попытке получить доступ, может вообще такая путаница произойти.... Вообщем как-то было у меня один раз в яве, после чего даже не стал разбиратся, тут это для меня как бы аксиома
В целом огромное пасиба, за очень содержательные ответы... А ссылки на досуге обязательно почитаю, хотя в моей текущей конторе мы пишем исключительно на перле.. Да и раньше кода я комбинировал яву с перлом, то это были отдельные программы одной системы, как правило перл использовал за их регулярки... Если же внутри кода создавать, то я так понимаю, нужно будет устанавливать и виртуальную ява-машину, сейчас, я думаю мне этого никто не позволит сделать, в новой конторе я еще не набрал такого "веса" cerf_machine, тоже большой сенкс -------------------- менеджер по кодеврайтингу |
|||
|
||||
| cerf_machine |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.2.2007 Где: тебя носило? Репутация: 1 Всего: 1 |
Ух, ты Даже не думал, что можно связать с пакетом ссылку на функцию. Хотя это логично - перл крайне гибкий язык. korob2001, спасибо. Bulat, не за что;) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
К сожалению пока углубится особенно в ООП на перле нет времени...
Появился такой вопрос... При стандартном сеттере, если передаешь в качестве параметра не саму переменную, допустим $name = "Александр", а setName((shortName($name))); т.е., процедура shortName делает какие-то модификации с самой переменной... ?? -------------------- менеджер по кодеврайтингу |
|||
|
||||
| cerf_machine |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.2.2007 Где: тебя носило? Репутация: 1 Всего: 1 |
Не понял вопрос.
setName получит $_[0] => return-значение shortName. |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
cerf_machine,
вопрос ты как раз понял и ответил на него Я лишь хотел убедится, что реально метод получит значение возвращаемое процедурой -------------------- менеджер по кодеврайтингу |
|||
|
||||
| korob2001 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ответ уже дали, но всё же решил привести ещё один пример, так на всякий случай
Теперь осталось запустить программу из командной строки и передать ей своёимя в качестве параметра. Причём, что бы налядно увидеть работу программы, имя должно быть в беспорядочном регистре, например так: dEnNiS. Если программа была запушена правильно, то регистр будет исправлен. Нас интересует строка:
Сначала передаём параметр функции lc(), она преобразует строку в нежний регистр, т.е. она возвращает строку "dennis" и тут же передаёт её дальше, функции ucfirst(), которая поднимает первый символ строки в верхний регистр и возращает результат "Dennis" и наконец предаёт отредактированное имя методу $person->setName(). Т.е. сначала выполняется самая внутренняя функция, это аналогично применению скобок для изменения приоритета арифметических операций. Тоже самое можно делать и с методами, добавим в код ещё две строки, теперь он выглядит так:
В строке:
сначала выполняется метод $person->getName(), он возвращает текущее имя "Dennis", это имя передаётся функции uc(), которая переводит верхний регистр всю строку "DENNIS" и в конце устанавливаем уже проеобразованное имя методом $person->setName(). Это сообщение отредактировал(а) korob2001 - 5.10.2007, 17:06 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||
|
|||||||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
В целом, тема очень широкая, и появились еще дополнительные вопросы... Вообще конечно, кое-что уже было разъяснено ;) однако я сам не с того конца сформулировал вопрос, поэтому и не получил все ответы на него...
В целом получится может даже убить два зайца... Изначально был очень хороший, но все же тривиальный пример... А меня сейчас интересует нечто более глубже... В данном примере, все поля класса - хеши, у класса есть свои методы и т.п. Все это хорошо, но если нам нужно что-то более сложноструктурированное, чтоб допустим этот класс, являлся лишь полем какого-то другого класса... И при этом из нового класса, доступ ко всем методам класса текущего, получается что-то типа наследования... Если не представится сложным, хотелось также затронуть момент переопределения метода, и для разнообразия побольше функциональных действий в самом конструкторе... P.S. В дополнение, также пока не совсем понял как лучше работать с директориями(пакетами), куда можно объеденить несколько классов, попытаюсь изобразить более визуально ./myScript.pl - <корневой скрипт> ./myClasses/... - пакет, где находятся классы, допустим ./myClasses/classesForDB/... ./myClasses/classesForFiles/... ./myInterfaces/.... ./myUtils/... - также содержатся какие-то классы ./myModules/... - просто модули ./files/... - пакет просто для каких-то конфигов, xml-файлов, или еще чего-нить ... Для знатока явы, я думаю понятно, что я хотел спросить про пакеты и подпакеты -------------------- менеджер по кодеврайтингу |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
> чтоб допустим этот класс, являлся лишь полем какого-то другого класса
создаешь переменную в классе и этой переменной присваиваешь класс, т.к. класс в перле это всего лишь blessed ссылка (или array, ...) > хотелось также затронуть момент переопределения метода, для переопределения метода базового класса вообще ни чего не надо делать -- поиск метода всегда начинается с пространства имен текущего класса и только если ни чего не нашлось, то потом поочереди перебирается дерево базовых классов. другое дело если надо в классе переопределить встроенный в перл метод -- в начале класса надо объявить эту функцию, например переопределение split: use subs qw(split); а уже ниже её описать. экспортировать такую функцию не советую, путь живёт в пространстве имен только этого класса > побольше функциональных действий в самом конструкторе... в конструкторе можно делать что угодно, это самая обычная функция, которую и обозвать можно как угодно, например в Tk принято конструктору давать имя класса, хотя наиболее частый вариант -- это new > как лучше работать с директориями(пакетами), куда можно объеденить несколько классов создать для них каталог, например QQQ, и потом подключать их как use QQQ::модуль1; use QQQ::модуль2; но и названия пакетов внутри тоже должны быть приведены к этому виду: package QQQ::пакет1; use 5.008; use strict; use QQQ::модуль2; ... ЗЫ посмотри любой каталог, где лежат модули перла |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Все же не совсем понял, а именно use QQQ::модуль1; package QQQ::пакет1; use QQQ::модуль2; тривиальный пример есть два модуля: util.pm и work.pm, что и где должно прописатся чтобы можно было работать при структуре ./mainScript.pl ./modules/util.pm ./modules/work.pm Но меня, интересует как бы не только раскидал по директориям и работаешь из основного скрипта... Но и такие ситуации, что модули из одного подкаталога должны использовать процедуры или модули из другого подкаталога... Конечно можно все это писать ручками в самих скриптах, указывая пути, но хотелось бы что-то более оптимальное, чтоб при работе, при подключении модулей, он просматривал корневой каталог текущего проекта, а там дальше по подкаталогам и к нужнему конфигу или модулю... Пример конечно не плохой, но уж слишком "на пальцах" -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Хм...
Что касается пакетов, то частично решил свои задачи, правда не могу пока знать все плюсы и минусы подобного подхода, надеюсь подскажете модуль
соотв в самом скрипте достаточно подключить его use modules::printDatas, а для вызова процедуры достаточно PrintHeader допустим, но здесь у меня возник еще один вопрос. В модуле я ручками прописываю push @EXPORT , '&PrintHeader';, но если уже есть хотелось бы, чтоб это выполнялось для всех процедур, которые есть в модуле... Конечно можно и ручками придумать нечто подобное, но если велосипед изобрели до меня -------------------- менеджер по кодеврайтингу |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
Для экспорта должен быть резон
Иногда гораздо читабельне вызывать функции по полному имени: modules::printDatas::PrintHeader(); или для чего-то с зависимым содержанием создали класс, а потом вызывали через его указатель функции: my $pd = printDatas::new(); $pd->PrintHeader(); А если Вам хочется заняться экспортом, то надо заметить, что экспортироваться могут не только функции, но и любые переменные, массивы, хеши. а our @EXPORT; push @EXPORT , '&PrintHeader'; ... # куча push проще описать как our @EXPORT = qw(PrintHeader PrintFooter PrintMainLinks); не забывайте про списковый контекст, это часто очень удобный способ передачи данных PS вообще плохой пример с названием modules, желательно что-то осмысленное. В лучше бы Вы подключили каталог modules в переменную просмотра путей для поиска модулей: use lib qw(ваш_путь/modules ещё_один_путь_к_другой_группе_модулей); use printDatas; ... printDatas::PrintHeader(); PPS пустой блок END { } не имеет смысла, как и BEGIN стоящий в самом начале файла -- код в нем и так выполнится первым. Главное чтоб Вы модули подключали через use, а не require, при первом способе компиляция выполняется при старте программы, при втором -- при обращении к ней. |
|||
|
||||
| Bulat |
|
||||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Резон-то есть... Методы(процедуры) вызываются в основном скрипте, это все ж не просто классы экземпляры данных
совсем не проще, какая разница, мне и так и так нужно перечислять весь список своих методов... хм, я имел ввиду другое, что-то, что позволило бы сразу все методы, без перечисления...
скока пишу, столько встречаюсь, что не поставленные где-то скобки(потому как сейчас они не имеют смысла) и т.п. частенько плачевно заканчиваются, лучше все же сначала закончить написание всего кода, а уже потом решать что нужно, а что нет ;) -------------------- менеджер по кодеврайтингу |
||||||
|
|||||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
некромантирую свою старую тему.
Хотелось бы узнать делал кто-нить, если - да, то мож пример какой по переопределению методов, то бишь функций.. Полная аналогия с тем, что в ООП называется переопределение. И даже для большего страха Ес-но, сама суть в том, чтобы организовать хак, при котором определенная функция переопределяется и начинает работать по иному алгоритму нежели стандартная P.S. Интересует именно переопределение, а не альтернативные реализации хака )) -------------------- менеджер по кодеврайтингу |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
SUPER псевдо-класс?
Это сообщение отредактировал(а) gcc - 15.9.2009, 12:10 |
|||
|
||||
| sir_nuf_nuf |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
делали.. для какого то мелкого модуля протокола STOMP..
Но если не используется OOP - это довольно шаткое решени. Заменить процедуру в любом модуле легко
Однако, если эта процедуру кто ли-бо импортировал до момента подмены - у них останется старая. В этом весь трабл.
Поэтому если вы хотите такое провернуть, то нужно подменять процедуру в самом начале
|
||||||
|
|||||||
| Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Вот на этом моменте я тоже призадумался
В том-то и вся проблема, что при такой реализации - все будет выглядеть еще некрасивее. gcc, не натыкается-ли твой способ на эти же грабли?? -------------------- менеджер по кодеврайтингу |
||||
|
|||||
| gcc |
|
||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
для множественного наследования есть давно: use NEXT; http://search.cpan.org/~flora/NEXT-0.64/lib/NEXT.pm
и много разных дополнений написанных на Си use Class::C3; http://search.cpan.org/~blblack/Catalyst-P...st/Plugin/C3.pm http://search.cpan.org/search?query=mro&mode=all в каталисте в новой версии используется: Class::C3::Adopt::NEXT http://search.cpan.org/~flora/Class-C3-Ado...3/Adopt/NEXT.pm в отладке выводиться сообщение что нужно перейти на этот модуль (проблем с переопределение в данном случае по-моиму не будет)
в какой-то старой книге (Кристенсен 2 или 3 издание, я книгу сейчас не смог открыть компе) было написано что можно как-то обойти это если использовать множественное наследование с SUPER... Это сообщение отредактировал(а) gcc - 15.9.2009, 19:12 |
||||
|
|||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Подменять чужие функции - вообще некрасиво. Другое дело как это сделать менее убого.. Ну создайте отдельный модуль типа .. Startup, в котором весь этот кошмар и изложите. А далее - либо первой строчкой своего скрипта его подгружайте, либо как startup.pl при старте mod_perl |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
sir_nuf_nuf, а NEXT тут разве не подходит? его автор сделал как раз для множественного наследования...
|
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
gcc, нет. он подходит только если наследование (т.е. ООП) вообще имеет место.
Мы же говорим про импорт обычных процедур. не методов объектов |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Действительно, это важный момент, сохранять целостность семантики кода... Тот кто после меня посмотрит мой код должен понимать не только как, но и что в нем происходит, а когда налеплено где-то процедурное, где-то ООП - это тоже не красиво... Вариант.. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
Bulat, а в Java множественного наследования вроде бы нету и не будет...
|
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Java - это уже сам по себе объекто-ориентированный и ссылочный язык. Там много устроено по иному нежели в перл... И переопределение происходит на уровне дочернего класса... Кроме того и перегрузка методов еще есть... Пафос перла-то в том, что нет необходимости писать огромное количество кода, когда можно обойтись десятью строчками. А в Java как такого множественного наследования нет, но есть интерфейсы ;) Хотя по мне это одно и то же... Ну мож за всю жизнь пару раз все же придется залезть так "глубоко", чтоб почувствовать и в этом разницу -------------------- менеджер по кодеврайтингу |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |