PDA

Просмотр полной версии : как правильно получать ссылку на Main из вложенного в него DOCa


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

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


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


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 - вообще виснет приложение от такого

illuzor
24.09.2015, 19:18
никак не могу понять этот основной момент ООП
Вызывать методы родителя - плохая практика ООП.
Лучше диспатчить из чилда события и в родителе отлавливать их.

Wolsh
24.09.2015, 19:27
Зачем Вы создаете экземпляр FloatingCont и записываете его в переменную, в которую следующим действием записываете obj?
И зачем Вам "другая ссылка" на мейн? Чем эта не устраивает?

nelco
24.09.2015, 19:34
(root as Main).fullFillFloatingCont(new FloatingCont("C://Arrays.as"));

например, вместо этого я напишу dispatchEvent("someEvent");

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

Добавлено через 2 минуты

И зачем Вам "другая ссылка" на мейн? Чем эта не устраивает?

т.к. говорили, что так неправильно делать

Добавлено через 5 минут
Зачем Вы создаете экземпляр FloatingCont и записываете его в переменную, в которую следующим действием записываете obj?

чтобы создался объект new FloatingCont(); иначе же он будет null и _floatingCont=obj; заругается на то, что _floatingCont = null?

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

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

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

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

nelco
24.09.2015, 20:39
понял, спасибо! буду пробовать...
но если так всё диспатчить и ловить в Main то там будет большая куча слушателей же, но пока попробую как будет, а потом буду думать как это всё сократить

caseyryan
24.09.2015, 20:45
В Main вообще должно быть минимум всего. Только инициализация основных компонентов. Но пока делай так, чтобы сильно голову на начальном этапе не засорять. У всех поначалу Main напоминает полотенце)

Wolsh
24.09.2015, 23:02
но если так всё диспатчить и ловить в Main то там будет большая кучаЭто вопрос Проектирования. Надо стремиться к оптимальной иерархии. Самые мелкие элементы не обязательно должны общаться с мейном. У них обычно есть свои старшие. Ребенок не обязан писать Президенту, что он описался. С этим разберется и папа. Мейн будет общаться с несколькими министрами, те с подчиненными менеджерами и так далее до последнего дворника. Здесь важно, чтобы дворник не решал за Президента, куда поехать министру.

udaaff
25.09.2015, 03:06
http://www.ozon.ru/context/detail/id/5960370/