PDA

Просмотр полной версии : Вызов методов основного класса приложения


Furinax
26.11.2009, 15:49
У меня есть основной класс приложения с public методом.
package mainparts {

import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.MouseEvent;

import mainparts.menuparts.FieldPiece;

public class JobInterface extends MovieClip {

private var buildingMenu:MovieClip;

private var fieldPiece1:MovieClip;
private var fieldPiece2:MovieClip;

public function JobInterface() {
addFields();
};

private function addFields():void {
var field1:Sprite = new Sprite();
var field2:Sprite = new Sprite();

fieldPiece1 = new FieldPiece();
fieldPiece2 = new FieldPiece();

addChild(field1);
addChild(field2);

field1.addChild(fieldPiece1);
field2.addChild(fieldPiece2);
};

public function addMenu():void {
trace("3124235434654654766357865756");
};
};
}

И есть класс, экземпляр которого является отображаемым внуком основного класса.
package game.menuparts {

import flash.display.MovieClip;
import flash.events.MouseEvent;

import game.JobInterface;

public class FieldPiece extends MovieClip {

public function FieldPiece() {
addEventListener(MouseEvent.MOUSE_DOWN, addBuildingMenu);
};

private function addBuildingMenu(e:MouseEvent):void {
(parent as JobInterface).parent.addMenu(); //выдает ошибку
};

};
}

Пожалуйсто подскажите решение, у самого додуматься не получается.

dsQuadro
26.11.2009, 16:10
нужно либо внуку передавать ссылку на метод, либо внук должен генерировать событие, которое должен слушать родитель и запускать нужный метод

Hidest
26.11.2009, 16:11
parent не лишний ли поставили? плюс, парент кого у вас в обработчике?

(e.target.parent as JobInterface).addMenu();

Furinax
26.11.2009, 16:29
если протрассировать:
- мой вариант:
trace(parent.parent)
Output: [object JobInterface]

- ваш вариант
trace(e.target.parent as JobInterface)
Output: null

Знач мой вариант правильнее, только вот когда
trace((parent as JobInterface).parent.addMenu());

Выскакивает:
1061: Call to a possibly undefined method addMenu through a reference with static type flash.display:DisplayObjectContainer.

dsQuadro
26.11.2009, 16:32
если я не ошибаюсь то через парент нельзя вызывать пользовательские методы как в ас2, а ссылка точно работать будет

Furinax
26.11.2009, 16:35
Тогда еще вопрос (можете закидывать меня тухлыми яйцами и помидорами :rolleyes:): как внуку передать ссылку на прародителя?

switcher!
26.11.2009, 16:40
если я не ошибаюсь то через парент нельзя вызывать пользовательские методы
можно. Тип только нужно привести.

dsQuadro
26.11.2009, 16:41
var child = new Child(func);

public function func(){

}

public class Child{
private var parentMetod:Function
public function Child(link:Function){
this.parentMetod = link;

parentMetod();
}
}

2switcher!: даже если и можно то лучше так не делать... потому что количество предков может меняться...

switcher!
26.11.2009, 16:53
даже если и можно то лучше так не делать...
я в курсе :)

Furinax
26.11.2009, 17:19
Еще вопросики.
1) Почему лучше так не делать?

2) Обязательно ли link должен быть параметров конструктора, нельзя ли его использовать в качестве параметра для метода?

3) Я все таки решил генерировать событие, является ли такой подход лучшим среди трех?

dsQuadro
26.11.2009, 17:30
1- парент это понятие относящееся к списку отображения а не к архитектуре приложения
2- конструктор это тотже метод, только он вызывается при создании экземпляра... так что не обязательно... можно даже извне в любой момент присвоить ссылку открытой переменной...
3- событие наиболее гибкий чтоли вариант... но для некоторых вещей может пригодиться и ссылка... в своей игрушке у меня ссылки между обьектами которые всегда есть с самого начала, а событиями организовано взаимодействие с такими вещами как здания или юниты...