Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.09.2015, 18:51
nelco вне форума Посмотреть профиль Отправить личное сообщение для nelco Найти все сообщения от nelco
  № 1  
Ответить с цитированием
nelco
 
Аватар для nelco

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
По умолчанию как правильно получать ссылку на Main из вложенного в него DOCa

никак не могу понять этот основной момент ООП :\ как получать доступ к методам вложенных объектов - понятно, а из вложенных объектов как получить ссылку на parent - не могу полностью понять...

в document-классе создаю объекты-контейнеры, из которых нужно вызывать метод document-класса:

Код AS3:
 
	public class Main extends Sprite 
	{
 
		public var floatingCont:FloatingCont;
		private var _chapters:Chapters;
		private var _codeExamples:CodeExamples;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		public function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			_chapters = new Chapters();
			addChild(_chapters);
 
			addChild(_codeExamples = new CodeExamples());
			_codeExamples.x = 300;
 
		}
 
		public function fullFillFloatingCont(obj:FloatingCont):void {
			if (floatingCont) {
				removeChild(floatingCont);
			}
 
			floatingCont = new FloatingCont();
			floatingCont = obj;
			addChild(floatingCont);
 
		}
 
 
	}
 
}
мне нужно вызывать метод fullFillFloatingCont из класса _chapters:Chapters

Код AS3:
 
	public class Chapters extends Sprite
	{
		private var _button1:Button;
		private var _button2:Button;
		private var _floatingCont:FloatingCont;
 
		public function Chapters() 
		{	
 
			_button1 = new Button("кнопка1");
			_button2 = new Button("кнопка2");
			_button2.y = 200;
 
			addChild(_button1);
			addChild(_button2);
 
			_button1.addEventListener(MouseEvent.CLICK, clickListener);
			_button2.addEventListener(MouseEvent.CLICK, clickListener);
		}
 
 
		private function clickListener(e:MouseEvent):void 
		{	
			switch(e.currentTarget) {
 
				case _button1:
				(root as Main).fullFillFloatingCont(new FloatingCont("C://Arrays.as"));
					break;
 
				case _button2:
				(root as Main).fullFillFloatingCont(new FloatingCont("C://AVScanner.ini"));
					break;
 
			}
		}
 
}
}
как в этом классе вместо (root as Main) создать ссылку на Main, чтобы можно было вызывать метод fullFillFloatingCont?
пробовал в поле класса писать что-то типа _main:Main - вообще виснет приложение от такого

Старый 24.09.2015, 19:18
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 2  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Цитата:
никак не могу понять этот основной момент ООП
Вызывать методы родителя - плохая практика ООП.
Лучше диспатчить из чилда события и в родителе отлавливать их.

Старый 24.09.2015, 19:27
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Зачем Вы создаете экземпляр FloatingCont и записываете его в переменную, в которую следующим действием записываете obj?
И зачем Вам "другая ссылка" на мейн? Чем эта не устраивает?
__________________
Reality.getBounds(this);

Старый 24.09.2015, 19:34
nelco вне форума Посмотреть профиль Отправить личное сообщение для nelco Найти все сообщения от nelco
  № 4  
Ответить с цитированием
nelco
 
Аватар для nelco

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
Код AS3:
(root as Main).fullFillFloatingCont(new FloatingCont("C://Arrays.as"));
например, вместо этого я напишу dispatchEvent("someEvent");

в Main поставлю слушатель на "someEvent" и запущу функцию fullFillFloatingCont, а как передам туда параметры тогда?

Добавлено через 2 минуты
Цитата:
Сообщение от Wolsh Посмотреть сообщение
И зачем Вам "другая ссылка" на мейн? Чем эта не устраивает?
т.к. говорили, что так неправильно делать

Добавлено через 5 минут
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Зачем Вы создаете экземпляр FloatingCont и записываете его в переменную, в которую следующим действием записываете obj?
чтобы создался объект new FloatingCont(); иначе же он будет null и _floatingCont=obj; заругается на то, что _floatingCont = null?

Добавлено через 8 минут
а, да, если убрать _floatingCont = new FloatingCont() то тоже работает, только я тогда не совсем понимаю как... в каком месте выполнилось new FloatinCont()? в классе _chapters значит?

Старый 24.09.2015, 20:12
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Для того, чтобы объект создался, технически достаточно написать new FloatingCont(); и всё. Оператор new создает экземпляр класса, указанного за ним, вызывая конструктор этого класса (то есть описанную в классе публичную функцию FloatingCont). А переменная _floatingCont создается оператором var. То есть сначала Вы создаете переменную ("объявляете переменную") и указываете ее тип
Код AS3:
public var floatingCont:FloatingCont;
Всё, переменная создана. Но она "не инициализирована", то есть в нее не записано никакое значение, никакая ссылка. Если сейчас выполнить trace(floatingCont), то трейс выдаст undefined, то есть "не определена", или null. Но сама переменная есть. Вы можете записать в нее ссылку на объект класса FloatingCont (или его класса-наследника). Ссылка может быть либо взята из другой переменной (floatingCont = obj), либо получена как результат работы функции, если функция возвращает (return) значение именно этого типа FloatingCont. Например, конструктор определенно возвращает именно этот тип)) Поэтому запись floatingCont = new FloatingCont(); запишет в переменную ссылку на экземпляр класса FloatingCont — результат вызова оператора new.

Добавлено через 6 минут
Цитата:
т.к. говорили, что так неправильно делать
Неправильно — указывать мейну, что сделать. Это как ребенок, приказывающий отцу. Так что неважно, как Вы получите ссылку на мейн. Неправильным является вообще получать и использовать эту ссылку.

Добавлено через 9 минут
Цитата:
а как передам туда параметры тогда?
Зависит от того, какие параметры. В Вашем случае это просто строка, адрес файла. Тогда можно диспатчить не простой Event, а DataEvent — у него есть строковое свойство .data, в которое можно записать Вашу строку перед диспатчем и прочитать ее в обработчике в мейне.
__________________
Reality.getBounds(this);

Старый 24.09.2015, 20:39
nelco вне форума Посмотреть профиль Отправить личное сообщение для nelco Найти все сообщения от nelco
  № 6  
Ответить с цитированием
nelco
 
Аватар для nelco

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
понял, спасибо! буду пробовать...
но если так всё диспатчить и ловить в Main то там будет большая куча слушателей же, но пока попробую как будет, а потом буду думать как это всё сократить

Старый 24.09.2015, 20:45
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
В Main вообще должно быть минимум всего. Только инициализация основных компонентов. Но пока делай так, чтобы сильно голову на начальном этапе не засорять. У всех поначалу Main напоминает полотенце)

Старый 24.09.2015, 23:02
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
но если так всё диспатчить и ловить в Main то там будет большая куча
Это вопрос Проектирования. Надо стремиться к оптимальной иерархии. Самые мелкие элементы не обязательно должны общаться с мейном. У них обычно есть свои старшие. Ребенок не обязан писать Президенту, что он описался. С этим разберется и папа. Мейн будет общаться с несколькими министрами, те с подчиненными менеджерами и так далее до последнего дворника. Здесь важно, чтобы дворник не решал за Президента, куда поехать министру.
__________________
Reality.getBounds(this);

Старый 25.09.2015, 03:06
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 9  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
http://www.ozon.ru/context/detail/id/5960370/

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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