![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
Народ, я слышал что в perl можно создавать классы,
хотелось бы узнать как? если можно маленький пример, класса скажем с двумя полями, и одним методом, который складывает эти поля и возвращает сумму ![]() Заранее спасибо -------------------- |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perldoc perltoot
|
|||
|
||||
korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Вобщем написал тебе такой вот тестовый класс. Сохрание его под именем Sum.pm
Тепрь в тот же каталог, сохрани следующую программу, под любым именем лишь бы расширение было как у выполняемого файла, как правило это .pl или .cgi. Я назвал его test.pl
Ну и читай коментарии, там всё пояснено. Если чего-то не поймёшь, спрашивай. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
DEER |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
Спасибо!
Я так понял, что внутри каждого метода мы получаем доступ к классу(его методам и всойствам) через shift. Так? Тогда можно сделать так? то есть внутри класса вызывать его методы?
также можно объявить именованное свойство в конструкторе
и тогда для этого свойства нужно описать функцию
Так? -------------------- |
||||||
|
|||||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ты почти всё верно понял, но shift всеголишь вытаскивает первый елемент массива и возвращает его.
Теперь переменная $color содержит строку "red", а массив @color содержит теперь 2 елемента "green" и "blue". Вобщем игра со стёком. В нашем случае, мы не указываем имени массива из которого нужно извлекать первый елемент, если массив не указан и shift находится внутри подпрограммы, то будет извлечён первый елемент массива @_, если shift вне подпрограммы и не указан явно массив, то будет извлечён первый елемент массива @ARGV. Т.е. когда ты вызываешь метод, первым параметром всегда является объект. Это легко проверить. Добавь такой метод в класс Sum.pm
Ну и конечно же вызови его из основной программы. Увидишь примерно такую строку: Sum=ARRAY(0x2252f8) где Sum имя пакета, а ARRAY(0x2252f8) ссылка на анонимный массив, в нашем случае в нём сохраняются члены класса. Мы его создаём в конструкторе. Внутри класса можно обращаться к методам и напрямую, указав его имя, но всё же рекомендуется обращаться через обьект, потому мы сначала извлекаем объект с помощью shift, ну а затем через него обращаемся к методам. Кстати можно создавать закрытые методы, для этого нужно, что бы имя метода начиналось с символа _ :
Можно так же реализовать закрытость ещё более надёжную, если заключить члены в блок (т.е. в фигурные скобки ) и объявить их как локальные, через my. Это сообщение отредактировал(а) korob2001 - 16.11.2005, 14:12 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
Угу почти понятно
![]() Спасибо! -------------------- |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ну вообще-то ООП, тема довольно не маленькая, но очень затягивающая. Очень хорошо она описана в книге "Программирование на Perl" Ларри Уолл, Том Кристеасон, Джон Орвант. Она помоему есть в нашей библиотеке, посмотри. Ну а так же поищи через поисковик, здесь уже много раз поднимались подобные темы.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
korob2001 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Гость_Nick - главное спокойствие.
Отрываем "Perl - специальный справочник" Стивен Холзнер (страница 357) и читаем. Создание приватных методов и данных Хотя многие объектно-ориентированные языки программирования поддерживают приватные методы и переменные ( то есть внутренние методы и переменные, не достижимые вне класса или объекта ), Perl не позволяет делать этого явно. Вы всегда можете использовать переменные с лексической областью видимости (ключевое слово my), что бы ограничить область видимости переменных текущим пакетом. Что бы создать приватные переменные, надо воспользоваться следующим соглашением Perl: приватные имена начинаются с символа подчёркивания. В отличии от языков типа C++, Java или Delphi, это не значит, что вы не може получить доступ к приватным переменным и методам объекта. Идея состоит в том, что если имя начинается с символа подчёркивания, его не следует использовать, поскольку оно считается приватным. В следующем примере публичный ( открытый ) метод sum исплользует приватный ( закрытый ) метод _add для сложения двух велечин:
Вот результат использования метода sum:
Собственно это я и имел ввиду. Ну а так, можно создать истенно закрытый метод:
Или даже так, ещё больше закрытый:
Я так и не понял твоего сорказма, будь добр поясни. Это сообщение отредактировал(а) korob2001 - 16.11.2005, 16:36 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||
|
|||||||||
Гость_Nick |
|
||||||||||
Unregistered |
А почему я своего сообщения не вижу?
И язык у меня не козлиный... Я только после того как отправил сообщение увидел, что ты модератор ![]() Вообще в конце того сообщения хотел извиниться, но передумал, т.к. ну не перевариваю я когда люди толком не знают неких вещей а сообщают об этом как большие знатоки, ну сори... ![]() ![]() А что касается закрытых методов, ты пишешь
Прочитай внимательнее ту цитату, которую приводишь в качестве контр аргумента:
Но по твоему выходит, что позволяет: ибо использование "_" для закрытия метода есть не что иное, как явное указание Perl'у на то что метод закрыт.
Это просто соглашение и не более. Т.е. на самом деле метод не является закрытым. Хочешь сделать закрытый метод, можно, например, так:
Использование:
Но опять же это не будет в полной мере приватный метод в понимании C++. Т.к. С++ компилятор будет ругаться на неправильное использование методов на стадии компиляции, а Perl это все проглотит и будет ругаться только на стадии исполниния, что чревато. |
||||||||||
|
|||||||||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Гость_Nick - ты меня тоже извини, я тоже какой-то злой сегодня. Может погода влияет?
Вобщем каждый из нас обратил внимание на то, что ему хотелось. Я собственно назвал этот метод приватным потому что раздел в книге называется: Создание приватных методов и данных, с другой стороны я так же сказал:
Пример этого способа привёл постом выше. Зы: ты случайно NICK не с perl.ru, я имею ввиду 2001 год? Это сообщение отредактировал(а) korob2001 - 16.11.2005, 16:35 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Гость_Nick |
|
|||
Unregistered |
Ну разобрались и ладно.
![]() ЗЫ: Я не с perl.ru и вообще ниоткуда ![]() ЗЗЫ: Я вообще очень редко бываю на каких-либо форумах, сегодня случайно забрел и не удержался от ответа. ;) |
|||
|
||||
Kiber_rat |
|
|||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Может кому пригодится... Я тут читаю книжку "Perl best practices" by Damian Conway (есть у меня в виде html) там есть много полезного, в частности и по поводу ООП в perl. Так что рекомендую. Язык - родной англицкий
![]() -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
|||
|
||||
DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
Господа, а нет тонкостей(или разностей) написания классов под windows\linux?
просто написал класс, отлаживал под винды, а сейчас пытаюсь запустить всё это дело под linux'ом, он говорит
соответственно deer.cgi и Analisyst.pm лежат в одной директории ![]() -------------------- |
|||
|
||||
Kiber_rat |
|
|||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
В *nix имеет значение регистр символов, т.е. Analisyst и analisyst - разные файлы, прежде всего проверь это
![]() -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
|||
|
||||
sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
DEER а ты в deer.cgi указал
Проверь это! ![]() -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |