![]() |
Модераторы: 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. |