![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
собственно сабж
Как описуються приваты для екземпляров класса? В частности переменная должна быть масивом. ЗЫ: сорри, за глупый вопрос. Просто первый день сижу в перле. -------------------- |
|||
|
||||
| DEER |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 749 Регистрация: 12.4.2005 Где: г. Рязань Репутация: 1 Всего: 13 |
вроде чтобы переменная была приват, её надо начать со знака подчеркивания "_", хотя это для функций....
я спрашивал раньше, почитай, может поможет http://forum.vingrad.ru/index.php?showtopic=70947 Добавлено @ 10:45
-------------------- |
|||
|
||||
| Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
2DEER хмм, чот линк не грузиться.
Сорри перемудрил с постановкой задачи. Мне не обезательно делать приваты. Мне нужно чтоб переменная пренадлежала екземпляру. Сейчас понял как сделать статики (our), a 'my' как понял относиться только к области видимости отдельной функции. Это сообщение отредактировал(а) Jlekc - 24.1.2006, 12:27 -------------------- |
|||
|
||||
| korob2001 |
|
||||||||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Привет! Я не совсем понял постановки зададачи, но думаю тебя интересует следующее.
$self = это и есть наш массив екземпляра, точнее ссылка на массив. Теперь о my и our. Раз уж речь пошла о закрытости в классах, то давай и рассмотрим пример с классом. Для примера, давай создадим класс и тестовый файл, который будет использовать наш класс: Файл: MyClass.pm
Файл: test.pl
Здесь стоит обратить внимание на то, что массив @private_array имеет лексическую область видимости, т.е. к нему имеют доступ все методы которые находятся с ним в одном пакете. Если нужна ещё более сильная закрытость, то можно захватить в блок, массив и методы для работы с ним. Тогда доступ к нему будут иметь только те методы, которые находятся вместе с ним в одном блоке ( в одной лексической области видимости ). Для примера попробуем немного изменить код класса MyClass. Сохрани следующий класс и тестовый файл в одном каталоге: Файл: MyClass2.pm
Файл: test2.pl
Заметь, что все элементы, были добавлены в открытый массив, а не в закрытый. Теперь к закрытому массиву имеют доступ только 3 метода getPrivateArray(), getLength() и getSize(). Если вынести массив из блока, на старое место, то новые элементы будут добавлены в закрытый массив, а не в открытый. Те методы, которые находятся внутри блока, в нашем случае это getPrivateArray(), getLength() и getSize(), имеют доступ как к отрытому массиву, так и к закрытому. Просто в нашем случае они этого не делают, не потому, что не получится, а потому, что не было нужды. Для эксперимента, добавь в блок, в классе MyClass2.pm, ещё два метода:
А в тестовую программу test2.pl добавь, в конец следующие строки:
На самом деле, добавление новых методов в лексическую область, было излишним. Можно было бы вынести их за пределы лексической области и сделать так, что бы они были более универсальны. Давай попробуем сделать это. Вынеси теперь последние 2 метода (getTotalLength() и getTotalSize()), за пределы блока, сохранись и попробуй запустить тестовый файл. Результат будет будет не верным, точнее он будет показывать нам лишь размер массива @public_array. Для того, что бы всё это заработало вне лексической области видимости массива, воспользуемся уже существующими методами доступа. Теперь давай поправим наши, последние, два метода (getTotalLength() и getTotalSize()), следующим образом:
Теперь мы получим правильное значение, не зависимо от того, расположены они (методы) в одной лексической области с массивом @private_array или вне этой области. Но учти, что такой массив не является членом экземпляра, все изменения которые ты будешь делать, будут отражаться и на других объектах этого класса, т.е. если изначально создать два объекта, после вносить какие либо изменения через один объект, а в конце вывести общее кол-во елементов через оба объекта, то результаты будут одинаковы. Если тебе нужно, что бы каждый объект хранил свои идивидуальные члены то тебе нужен первый способ, который я привёл вначеле. Этот же способ более подходит для создания так называемых приватных методов. Т.е. ты объявляешь переменную, как my, а присваиваешь ей ссылку на подпрограмму.
Как ты уже наверное догадался, мы получим закрытый метод, который нельзя вызвать из вне пакета, а точнее той лексической области видимости, к которой он относится. Его так же можно захватить в блок, причём глубина блоков может быть любой. Что касается символа подчёркивания _, в начале имени метода, то это лишь соглашение, что такой метод считается закрытым и его вызывать из вне не нужно. Вот что пишет Ларри Уолл о закрытости, в книге "Программирование на Perl":
Это сообщение отредактировал(а) korob2001 - 24.1.2006, 13:56 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||||||||||||
|
|||||||||||||||||||||
| Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
2korob2001 зачет. Спасибо, разабрался.
Первый вариант меня вполне устраивает. Но и остальное было полезно почитать. -------------------- |
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Кстати, вот пример первого варианта, где каждый объект имеет свой екземпляр массива:
Файл: MyClass3.pm
Файл: test3.pl
Вот это пожалуй то, что тебе нужно. Какждый объект, хранит идивидуально свои данные (экземпляры). Вместо анонимного массива, в конструкторе можно использовать и скаляр и хеш и ссылку на подпрограмму. Это сообщение отредактировал(а) korob2001 - 24.1.2006, 14:29 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: нет Всего: 4 |
2korob2001 на '+' нарываемся7))
-------------------- |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |