Форум 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=208694)

Void 15.08.2014 19:43

Экземпляр основного класса
 
Как получить доступ к экземпляру основного класса из других классов? Который был создан при запуске флешки. И можно ли создать еще 1 объект основного класса?

КорДум 15.08.2014 20:04

Изучите паттерн "Singletone". Создать второй экземпляр можно. При загрузке одной флешки разными лоадерами в один аппдомен именно это и происходит.

Psijic 15.08.2014 20:20

вообще, экземпляр текущего класса - это this. Создать новый экземпляр корневого класса можно через new Main();

Void 15.08.2014 20:21

А как лучше реализовать такую задачу:
При запуске флешки в основном классе создаются объекты других классов, к которым позже надо будет обратиться. Вот как к ним обратиться? Знаю только что при запуске можно вывести ссылки на них из основного класса.

Zebestov 15.08.2014 20:23

Объекты нужно стараться создавать так, чтобы им не нужно было обращаться по принципу все-ко-всем.
А если уж какому-то объекту нужен тот или иной экземпляр, то его можно передать в виде ссылки в конструктор, например. В отдельных случаях более оправдан будет даже синглтон.
Но создавать кучу экземпляров, чтобы любой из них в любой момент мог добраться до любого другого — это плохая архитектура.

PsychoTech 15.08.2014 20:34

Цитата:

Сообщение от Void (Сообщение 1170638)
А как лучше реализовать такую задачу:
При запуске флешки в основном классе создаются объекты других классов, к которым позже надо будет обратиться. Вот как к ним обратиться? Знаю только что при запуске можно вывести ссылки на них из основного класса.

Наверно вам действительно нужно сначала определиться с иерархией вашего приложения. Насколько я понял вы пытаетесь запихнуть все в основной класс а обращаться хотите из других и не знаете как. Лично я бью все на вспомогательные классы а потом уже собираю интерактивную сцену. ИМХО:o

P.S. может я просто не понял проблему =(

Void 15.08.2014 20:46

Цитата:

Сообщение от PsychoTech (Сообщение 1170643)
Наверно вам действительно нужно сначала определиться с иерархией вашего приложения. Насколько я понял вы пытаетесь запихнуть все в основной класс а обращаться хотите из других и не знаете как. Лично я бью все на вспомогательные классы а потом уже собираю интерактивную сцену. ИМХО:o

P.S. может я просто не понял проблему =(

Именно задача, которая требует реализации:

Создать текстовое поле, в экземпляре основного класса или в любом другом объекте. И иметь доступ к этому полю из любого класса.

КорДум 15.08.2014 20:51

Так воспользуйтесь синглтоном, как я говорил выше. В данном случае это в корне не правильно так его использовать здесь, но это будет проще, чем полностью переделывать архитектуру приложения.

Void 15.08.2014 21:07

Цитата:

Сообщение от КорДум (Сообщение 1170650)
Так воспользуйтесь синглтоном, как я говорил выше. В данном случае это в корне не правильно так его использовать здесь, но это будет проще, чем полностью переделывать архитектуру приложения.

Можете предложить свою реализацию данной задачи? Как правильно это сделать.

PsychoTech 15.08.2014 21:28

Цитата:

Сообщение от Void (Сообщение 1170647)
Именно задача, которая требует реализации:

Создать текстовое поле, в экземпляре основного класса или в любом другом объекте. И иметь доступ к этому полю из любого класса.

тогда вот вам ваш вариант. Изначально в классе в котором хотите обратиться сделайте следующее


Код AS3:

public var Text: TextField;

и юзайте его по полной без инициализации.

а в главном уже инициализируете

Код AS3:

public var MyText: TextField;
 // ну и далее как положено

а когда инициализируете класс в котором обращаетесь добавляете

Код AS3:

YmyaKlasssa.Text = MyText;
// ну и все думаю дальше разберетесь аналогично и для других переменных.

но я бы так не делал стараюсь подобные случаи сводить к самому минимуму.

Добавлено через 1 минуту
да не забудьте импорт сделать туда сюда.

Void 15.08.2014 22:40

Цитата:

Сообщение от PsychoTech (Сообщение 1170655)
тогда вот вам ваш вариант. Изначально в классе в котором хотите обратиться сделайте следующее


Код AS3:

public var Text: TextField;

и юзайте его по полной без инициализации.

а в главном уже инициализируете

Код AS3:

public var MyText: TextField;
 // ну и далее как положено

а когда инициализируете класс в котором обращаетесь добавляете

Код AS3:

YmyaKlasssa.Text = MyText;
// ну и все думаю дальше разберетесь аналогично и для других переменных.

но я бы так не делал стараюсь подобные случаи сводить к самому минимуму.

Добавлено через 1 минуту
да не забудьте импорт сделать туда сюда.

Получается что для обращения из другого класса к уже созданному текстовому полю нужно передать ссылку на объект в котором создано это поле?
Где-то надо хранить ссылки на объекты?

КорДум 15.08.2014 22:51

Цитата:

Сообщение от Void (Сообщение 1170652)
Можете предложить свою реализацию данной задачи? Как правильно это сделать.

А зачем Вам доступ к текстфилду отовсюду? Старайтесь разделять логику и отображение. Я не впариваю про MVC, отнюдь, но на самом деле, это очень хорошая практика: тестфилдом управляет нечто, что получает команды посредством событий. Это можно реализовать как угодно, можно через модель (это просто класс с набором данных), в которой будут меняться данные и диспатчиться события.

Реализуйте логику по следующему принципу: дети не управляют своими родителями. Они могут сообщить родителю, что они что-то хотят, родитель сам должен принимать решение, как реагировать на просьбу и реагировать ли вообще. На самом деле очень тяжело говорить конкретно-общие вещи, не зная того, зачем Вам вообще это все понадобилось. Давайте свой конкретный пример и тут Вам пояснят. Без всяких MVC на данном этапе.

Void 16.08.2014 00:07

Цитата:

Сообщение от КорДум (Сообщение 1170658)
А зачем Вам доступ к текстфилду отовсюду? Старайтесь разделять логику и отображение. Я не впариваю про MVC, отнюдь, но на самом деле, это очень хорошая практика: тестфилдом управляет нечто, что получает команды посредством событий. Это можно реализовать как угодно, можно через модель (это просто класс с набором данных), в которой будут меняться данные и диспатчиться события.

Реализуйте логику по следующему принципу: дети не управляют своими родителями. Они могут сообщить родителю, что они что-то хотят, родитель сам должен принимать решение, как реагировать на просьбу и реагировать ли вообще. На самом деле очень тяжело говорить конкретно-общие вещи, не зная того, зачем Вам вообще это все понадобилось. Давайте свой конкретный пример и тут Вам пояснят. Без всяких MVC на данном этапе.

Зачем доступ? При "проектировании" приложения я создал 1 текстовое поле, в котором должны отображаться различные данные полученные от разных классов. Как пример: при подсоединении к cirrus, при подключении пира, при отключении пира, должно обновляться текстовое поле (За каждое действие отвечает свой класс).

http://imgdepo.ru/show/7177963
Вот так выглядит у меня структура приложения. При его запуске в основном классе создается текстовое поле и объект класса отвечающего за подключения к cirrus, в свою очередь при создании объекта в случае успешного подключения к серверу создается объект класса отвечающего за изменение текстового поля и вызов его методов.
Теперь, получается что надо сохранять ссылку на объект отвечающего за подключение, а ссылку на объект отвечающий за изменение текста не обязательно сохранять. Было бы совсем отлично если можно вызвать из стороннего класса метод основного класса, но как к нему обратиться(к основному классу).
Вот, если можете помочь подредактировать структуру приложения, будет прекрасно.

КорДум 16.08.2014 00:15

В основном классе создадим "большие" объекты. Например коннектор к циррусу (или менеджер запросов, не знаю, как у Вас), экземпляр текстфилда (в более обобщенном виде вместо текстфилда — просто некий контейнер с логикой отображения и какими-то элементами визуализации). Все события от коннектора (подключение, разрыв связи и т.д.) ловит экземпляр главного класса, после чего он решает, что делать: сказать контейнеру с отображением, что нужно записать некое сообщение. В данном случае эземпляр главного класса просто выступает посредником в перегонке данных туда-сюда.
Ой как не хочется Вам тут давать MVC или MVVM, но в итоге все равно придете к этому...

Void 16.08.2014 00:21

То есть отделить отображение от основного класса полностью? Создать отдельный класс отвечающий за создание текстового поля, его параметров и в основном классе создать его экземпляр? А если так сделать, то где-то надо будет постоянно хранить ссылку на этот объект, вдруг потребуется изменить параметры текстового поля, может быть даже не из главного класса.

Котяра 16.08.2014 00:28

2PsychoTech прекратите писать чушь.
Цитата:

Создать текстовое поле, в экземпляре основного класса или в любом другом объекте. И иметь доступ к этому полю из любого класса.
2Void - задача изначально поставлена неверно.
Читайте как мантру:
МНЕ НЕ НУЖНО ИМЕТЬ ДОСТУП К ЭТОМУ ПОЛЮ ИЗ ЛЮБОГО КЛАССА

Gerbert 16.08.2014 00:41

Цитата:

А зачем Вам доступ к текстфилду отовсюду? Старайтесь разделять логику и отображение.
ТС и пытался это сделать и эта тема подтверждение. Но вместо помощи, получил кучу упреков от таких же, как и он новичков, которые находятся в стадии "я знаю как не правильно, а как правильно не знаю". Честно сказать и я помочь не могу, так-как не понимаю задумки. ТС могу лишь сказать, что документ-класс, каковым является Main, не принято использовать для инициализации свойств и прочих ... прочих объектов связанных с приложением. В нем нужно лишь инициализировать класс, который будет создавать другие объекты и если нужно, передавать ссылки друг на друга в конструктор или ещё как-то..

Добавлено через 57 секунд
Void, что Вы в итоге хотите получить?

КорДум 16.08.2014 00:50

Жаль, я не обладаю способностями подавать информацию в учебной и легко усваиваемой форме. Смысл в том, чтобы правильно расставить "логическую вложенность". У Вас есть вполне конкретная задача: писать лог в текстовое поле. Туда могут лететь не только сообщения из коннектора к циррусу, но и всякая системная информация (например ровно в 00:00 надо написать "чувак, тебе завтра на работу, иди спать", а в 08:00 надо показать "с добрым утром").

Начальной точкой отправления мы имеем экземпляр главного класса. В нем создается экземпляр коннектора, экземпляр класса с таймером (и этими милыми лог-сообщениями) и экземпляр класса с отображением текстфилда, скроллбаром к нему, красивым фоном (этот экземпляр отображения добавлен в дисплейлиста экземпляра главного класса).

Как только в циррус-коннекторе что-то произошло (например кто-то подключился), он диспатчит событие "кто-то подключился" (кастомное событие) и прикладывает к нему какие-то данные (например айпи человека). Это событие ловит экземпляр главного класса и вызывает метод у экземпляра с отображением, передавая в него данные из события. Тот радостно хватает и отображает в нашем навороченном текстфилде лог-строку.

Далее, экземпляр класса с сигналами таймера (которые в 00:00 часов и 08:00) видит, что наступило время Х. И тоже шлет кастомное событие. Это событие тоже ловит экземпляр главного класса и вызывает какой-то другой метод у экземпляра с отображением, передавая (или не передавая) в параметрах необходимые данные.

Вот и все.

Далее, Вам захочется сделать, например, кнопку дисконнекта. В отображении делаем кнопку, нажатие на которую диспатчит какой-то иное событие "хочу_дисконнект". Экземпляр главного класса его ловит и вызывает метод у циррус-коннектора, который сделает дисконнект.

Циррус-коннектор следом шлет свое событие, которое так же через экземпляр главного класса попадает в отображение через вызов метода и вот в текстфилде красуется строка "дисконнект успешен" или сообщение об ошибке.

Фуф, надеюсь доходчиво объяснил. никаких MVC, просто разделение логики без жестких связей.

Добавлено через 1 минуту
Цитата:

Сообщение от Gerbert (Сообщение 1170665)
ТС могу лишь сказать, что документ-класс, каковым является Main, не принято использовать для инициализации свойств и прочих ... прочих объектов связанных с приложением. В нем нужно лишь инициализировать класс, который будет создавать другие объекты и если нужно, передавать ссылки друг на друга в конструктор или ещё как-то..

Неверно, это заблуждение. Чем Вам документ класс не угодил и чем он отличается от "другого экземпляра класса", который Вы советуете в нем создать?

Добавлено через 10 минут
А еще можно, чтобы экземпляр главного класса был более тонкой прослойкой, если написать в нем:
Код AS3:

cirrusConnector.addEventListener(CirrusEvent.SOME_EVENT, view.onSomeEventCirrusEvent);

То есть событие сразу попадает в хендлер отображения без необходимости экземпляра главного класса собственноручно принимать событие и вызывать метод у отображения. Все зависит от удобства и контекста. Может быть Вы захотите сделать экземпляр главного класса не просто связующим звеном, а непосредственно центром логики — контроллером.

Void 16.08.2014 01:02

Ага, спасибо. Только вот не понятно одно, получается участвовать в программе должен только 1 экземпляр класса связанным с чатом? Значит в конструкторе главного класса нужно создать объект класса чата и присвоить его переменной, а дальше по коду работать только с данной ссылкой на объект?

КорДум 16.08.2014 01:11

Вопрос непонятен. Если я правильно Вас понял, то Вы говорите про коннектор? Да, он один, он только шлет данные и принимает. И говорит еще всем, кто заинтересован, что у него появились новые данные — через события. Он не должен ничего решать за других. Он только делает свое дело и говорит, мол, ребят, тут пришло новое сообщение, кто там хочет, ловите. И шлет событие, которое уходит в отображение или в менеджер обработки или еще куда.

Точно так же с визуальной стороной. Она не должна приказывать никому, что она хочет сделать. Она должна ПОПРОСИТЬ через событие "дисконнект" или "отправить сообщение". То есть она диспатчит событие с текстом нового сообщения (у нас же чат?), а заинтересованный в этом сообщении менеджер запросов ловит это событие и вызывает метод у коннектора sendMessage с передачей текста.

В данной ситуации циррус-коннектор создается в менеджере запросов и только там хранится на него ссылка и нигде иначе. И никто эту ссылку не видит, только менеджер запросов.

Если Вы поймете, как отделить те или иные обособленные вещи в отдельные объекты, ничего не знающие друг о друге, Вы познаете дзен и тогда MVC Для Вас будет как семечки, ибо все будет понятно и не будет сотен этих одинаковых тем с глупыми вопросами по этому паттерну, хотя рядом лежит такая же тема с теми же вопросами и ответами на них, как тут обычно любят делать )

Void 16.08.2014 01:21

Цитата:

Сообщение от КорДум (Сообщение 1170671)
Вопрос непонятен. Если я правильно Вас понял, то Вы говорите про коннектор? Да, он один, он только шлет данные и принимает. И говорит еще всем, кто заинтересован, что у него появились новые данные — через события. Он не должен ничего решать за других. Он только делает свое дело и говорит, мол, ребят, тут пришло новое сообщение, кто там хочет, ловите. И шлет событие, которое уходит в отображение или в менеджер обработки или еще куда.

Точно так же с визуальной стороной. Она не должна приказывать никому, что она хочет сделать. Она должна ПОПРОСИТЬ через событие "дисконнект" или "отправить сообщение". То есть она диспатчит событие с текстом нового сообщения (у нас же чат?), а заинтересованный в этом сообщении менеджер запросов ловит это событие и вызывает метод у коннектора sendMessage с передачей текста.

В данной ситуации циррус-коннектор создается в менеджере запросов и только там хранится на него ссылка и нигде иначе. И никто эту ссылку не видит, только менеджер запросов.

Если Вы поймете, как отделить те или иные обособленные вещи в отдельные объекты, ничего не знающие друг о друге, Вы познаете дзен и тогда MVC Для Вас будет как семечки, ибо все будет понятно и не будет сотен этих одинаковых тем с глупыми вопросами по этому паттерну, хотя рядом лежит такая же тема с теми же вопросами и ответами на них, как тут обычно любят делать )

Можно по подробнее о менеджере запросов?

КорДум 16.08.2014 01:26

Что конкретно? Это просто класс, который выстраивает очередь запросов и последовательно их отправляет в коннектор, дожидаясь ответа от коннектора. И он же сигнализирует об ошибке в виде отправки события с ошибкой, если коннекор вдруг сообщил о каком-то косяке. Этот менеджер запросов может принять запрос на отправку сообщения и, скажем, проверить, подключен ли коннектор к серверу и, если нет, сообщить об этой проблеме заинтересованному кругу объектов.

Void 16.08.2014 01:45

http://imgdepo.ru/show/7178683
Вот так примерно? И если не трудно, нарисуйте полную версию.

КорДум 16.08.2014 14:09

Вложений: 1
Пунктирная линия — общение через события.
Сплошная — напрямую, вызывая методы, дергая акцессоры.
CirrusManager — принимает запросы, как-то их обрабатывает и передает непосредственно коннектору. Он же и сообщает об ошибках коннектора.

Psijic 17.08.2014 01:44

Думаю, необязательно создавать синглтон если нужный объект всегда на связи, просто статичный класс - для начала неплохо:
Код AS3:

public static var tf: TextField;


djyamato 19.08.2014 16:20

Цитата:

Сообщение от Void (Сообщение 1170647)
Именно задача, которая требует реализации:

Создать текстовое поле, в экземпляре основного класса или в любом другом объекте. И иметь доступ к этому полю из любого класса.

В какой-то момент я начал обращать внимание на архитектурные фрэймворки, остановился на swiz


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

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