2010-04-11 2 views
2

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

//Parent 
public class Main extends Sprite 
    { 
    public var selectedSquare:Sprite; 

    public function Main() 
     { 
     //inits and adds new Square child class to display list 
     } 
... 

------- 

//Child 
public function dragSquare(evt:MouseEvent):void 
    { 
    Sprite(parent).selectedSquare = this; //evil doesn't work! 
    parent.addChild(this); 
    this.startDrag(); 
    } 

Я получаю эту ошибку, но я кастинг родителей от DisplayObjectContainer к Sprite так я понятия не имею, почему он не работает.

1119: Доступ возможно неопределенного selectedSquare собственности через ссылки со статическим типом flash.display: Sprite.

ответ

4

Вы должны отдать родителя как основного, а не спрайта, поскольку у спрайта не будет ссылок на «selectedSquare». Если Main будет продлить MovieClip, это не будет проблемой, так как MovieClips может иметь динамически созданные ссылки.

Предлагаемая модификация функции ребенка:

public function dragSquare(evt:MouseEvent):void 
{ 
    (parent as Main).selectedSquare = this; 
    parent.addChild(this); 
    this.startDrag(); 
} 
+0

* лицо ладонь * спасибо – TheDarkIn1978

1

Другой причиной того, что это может не сработать в том, что вы пытаетесь использовать право собственности parent перед добавлением ребенка в список отображения родителя.

Sprite(parent).selectedSquare = this; 
parent.addChild(this); 

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

Или вторая линия не нужна (потому что this уже ребенок Main, поэтому this.parent, или просто parent, работает как ожидалось).

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

Я надеюсь, что это поможет! Дайте мне знать, если вы хотите, чтобы я что-то разъяснил.

(Это, конечно, если вы уже не знали все это и не делаете какое-то безумная, загадочной, странной магию с избыточным addChild вызова. Вы никогда не можете сказать, с волшебниками!)

+0

спасибо за ответ spiralganglion. да, «это» уже добавлено в список отображения, среди всех других подобных объектов, созданных классом. parent.addChild (this) вызывается просто для того, чтобы вывести «это» в начало списка отображения. Оглядываясь назад, я должен был исключить его из моего примера, чтобы избежать путаницы. – TheDarkIn1978

+2

Ах да. Когда я упомянул «волшебство магии», это то, что я ожидал от вас. Не для nitpick, но может быть яснее, если вы использовали синтаксис 'parent.setChildIndex (this, parent.numChildren-1)', за исключением того факта, что он немного больше * verbose *. – ivanreese

+0

спасибо за отзыв, я сделаю это, потому что это более специфично и, возможно, избежать более поздних проблем, поскольку программа становится более сложной. – TheDarkIn1978

Смежные вопросы