![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Infod |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 31.3.2007 Репутация: нет Всего: нет |
Есть класс MainClass.pm
создаем объект $main = new MainClass; присваиваем объекту константу $main->{myconst} = "Something"; В главном пакете есть много разных подпакетов вида MainClass::SubClass1 MainClass::SubClass2 объекты создаются вида: $main->{obj1} = new MainClass::SubClass1; также есть вида: MainClass::SubClass1::SubSubClass1 и есть класс MainClass::Uni::LWP.pm так вот, этот универсальный класс используется многими другими подклассами. и при создании объекта $ua = new MainClass::Uni::LWP; в него нужно передать константу $main->{myconst} из главного класса Как это сделать, если объект LWP создается во всех классах? Пока приходят в голову глобальные переменные (фи Помогите плз, я не очень силен в ООП, подозреваю, что ответ должен быть простой Сорри, если сумбурно Спасибо |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
У меня реализован такой механизм.
Так как весь основной функционал реализуется через методы ядра, и плагины добавляют объекту ядра дополнительный функционал тоже в виде методов, то объект ядра у меня сквозной: передаеться как параметр всем объектам - плагинам при создании и доступен из любой точки приложения.
И еще, как правило напрямую к объекту как к хешу не стоит обращаться, нужно реализовать доступ к свойствам через методы, тогда контролировать легче будет кто где и чего изменяет... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Infod |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 31.3.2007 Репутация: нет Всего: нет |
А есть ли более красивые способы? И сильно ли повлияет передача объекта во все другие объекты на использование памяти и быстродействие?
Я так и делаю, в примере для простоты написал |
||||
|
|||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Передается не объект а ссылка на него... а она у вас будет так или иначе передаваться, не важно каким способом вы получите доступ к нужному параметру... А вообще, это зависит от изначальной архитектуры приложения, если основной способ передачи параметров другой, то делайте пожалуй однотипно, чтоб самому не путаться потом... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Можно попробовать, в основном классе. Создать поле, в котором и будет храниться уже созданный объект класса MainClass::Uni::LWP. Создавать этот объект можно в конструкторе основного класса. Затем создать метод, который будет при необходимости возвращать уже готовый объект, всем подклассам, которые его используют или наследуют от него. В итоге у нас в памяти будет только один объект, с которым и будут работать все подклассы и наш основной класс. Разумеется такой подход не всегда уместен, но если при создании объекта используются одни и те же данные, то он вполне оправдан. Хотя возможно я не совсем понял условие задачи. Это сообщение отредактировал(а) korob2001 - 31.3.2007, 20:09 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Infod |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 31.3.2007 Репутация: нет Всего: нет |
Об этом я тоже сразу подумал, правда мне совсем не понятно, как это реализовать. Набросал пример, если не трудно, можете пояснить на этом коде?
т.е. не понятно, как созданным объектам получить доступ к объекту $obj. Или я создаю их неправильно? |
||||
|
|||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
||||
|
||||
| tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Как получится - так и "правильно".
Это сообщение отредактировал(а) tishaishii - 31.3.2007, 22:02 |
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ну так через конструкторы и передавай свою константу:
Константу мы передали до места назначения, но код этот глюковатый. Так как над ним можно, а главное нужно, хорошенько подумать. Для этого либо тебе нужно чётко изложить, цель всего, что написано выше, либо перейти на примеры попроще. Ты помоему сильно увлекаешься созданием методов-фабрик, т.е. в методе ты создаешь новый объект. Вот здесь например:
Перед тем как создавать такую фабрику объектов, нужно подумать: А действительно нужно создавать новый объект при каждом вызове метода main_func() или ua()? Или же можно создать этот объект один раз, в конструкторе или методе INIT, при созданнии текущего объекта, сохранить её в тот же анонимный хеш и пользоваться этой ссылкой везде, где объект не обязательно должен быть новым? -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Infod |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 31.3.2007 Репутация: нет Всего: нет |
Это ж неудобно. А если констант или переменных несколько, и каждому объекту нужны не все они? Передавать хеш с параметрами не предлагать
Это я в примере написал, чтобы показать, насколько бывает неудобно таскать эту константу по объектам. А цель у меня была - понять, как лучше всего обмениваться параметрами между объектами. Значит только передавать ссылку на главный объект или передавать каждому объекту нужные параметры через конструктор? |
||||
|
|||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
В принципе, можно передавать не только число или строку, можно создатьвать объект любого класса и передать его, твоему классу. Главное что бы твой класс был готов корректно работать с этим объектом. Как класс это будет делать, конечного программиста, использующего его, вообще не должно волновать. Он читает документацию, изучает интерфейс класса и работает с его открытыми методами и полями.
Так же не стоит забывать о наследовании, если ответ на вопрос: "Является?", положительный. Например: Пудель, является Собакой? Да. Значит класс Pudel может быть подклассом класса Dog. Собака, является Животным? Да. Значит класс Dog может быть подклассом класса Animal. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |