Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача или чтение парамера экземпляра класса (http://www.flasher.ru/forum/showthread.php?t=132701)

Cybo 18.11.2009 16:59

Передача или чтение парамера экземпляра класса
 
Есть ClassA потомок Sprite. В одном из методов этого класса создаётся экземпляр ClassB, тоже потомок Sprite. Оба класса представляют собой интерфейс пользователя. Теперь сам вопрос. Ширина ClassB зависит от ширины ClassA. Ширину ClassB предлагается задать одним и 2-х способов.
1) Передать размеры в конструкторе ClassB.
2) В классе ClassA объявить публичные статические переменные, и в ClassB импортировать ClassA и считывать эти свойства (например: w = ClassA.wi).
Мне кажется 2-ой способ какой-то неправильный...
Как лучше/правильнее поступить?

Котяра 18.11.2009 17:01

Ширина экземпляра ClassB зависит от ширины экземпляра ClassA.
экземпляр ClassB должен иметь ссылку на экземпляр СlassA

Cybo 18.11.2009 17:19

а тогда просто к parent экземпляра ClassB обратится не проще?

Hidest 18.11.2009 18:19

Если вы будете уверены, что у вас всегда parent - это ClassA, то можно и через него. Но если все же придется когда-нибудь что-нибудь переделывать в архитектуре, то лучше передавать ссылку отдельно, тогда будет все равно, кто там parent.

Cybo 18.11.2009 18:47

понятно. спасибо.

SamFR 18.11.2009 20:06

Лучше не иметь ссылку в явном виде, а подписываться на событие.
То есть:
  1. экземпляр ClassA при изменении своего размера высылает событие Event.RESIZE.
  2. при создании экземпляра ClassB мы подписываем его на это событие экземпляра ClassA.
  3. при получении события экземпляр ClassB обновляет свою ширину в соответствии с (event.target as ClassA).width.

Cybo 19.11.2009 00:12

т.е. при удалении ClassB нужно будет подчищать подписку? Хотя подписываться и очищать подписку можно в самом ClassB, только ему опять же нужно передавать ссылку на ClassA. А не слишком ли геморно получается?

SamFR 19.11.2009 01:08

Удалять подписку можно из того места, где происходит удаление экземпляра ClassB. Можно сделать это и автоматически, но тогда, как вы сказали, придётся сохранять ссылку на экземпляр ClassA. Как мне кажется, ничего особо плохого в этом нет, если ссылка будет использоваться только для удаления подписки.

Однако, в случае сохранения ссылки, нужно учесть, что при удалении экземпляра ClassA ссылка на него в экземпляре ClassB должна быть занулена. Узнать момент удаления можно, например, путём посылки из экземпляра CLassA события удаления. Это в том случае, если предполагается удалять экземпляр ClassA.

Вопрос номер 2: как вы, без использования событий, будете узнавать, что ширина экземпляра ClassA изменилась?

Вариант только один: хранить в нём ссылку на экземпляр ClassB и вызывать при изменении своей ширины какой-то метод этого экземпляра. Не находите это немного некрасивым? А если есть ещё третий, четвертый и т.д. экземпляры ClassB? Не забывайте также, что при удалении экземпляров ClassB ссылки на них нужно занулять. Вот здесь, по-моему, как раз и начинается настоящий гемор :)

Добавлено через 2 минуты
А, да, есть ещё один вариант: в экземпляре ClassB повесить на этерфрейм (или таймер) обработчик, который будет сравнивать ширину экземпляра ClassA со своей, и, в случае несовпадения, обновлять свою ширину. Этот метод для настоящих извращенцев :)

Cybo 19.11.2009 10:32

Хм... действитель, экземпляров ClassB может быть много. Спасибо!


Часовой пояс GMT +4, время: 01:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.