вызовите функцию вызова as3 в одном дочернем классе из другого дочернего класса - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь вызвать функцию в одном дочернем классе (Circle.as) из другого дочернего класса (Wedge.as).Circle.as создается классом документов (Tree.as), а Wedge.as - Circle.as.Как мне это сделать?Это мой код:

Tree.as

package com.treediagram  
{  
  public class Tree extends MovieClip  
  {
    var firstCircle:Circle = new Circle();
    addChild(firstCircle);
  }
}

Circle.as:

package com.treediagram
{
  public class Circle extends MovieClip  
  {
    private var wedge:Wedge;
    public function Circle()  
    {
      var circleHolder:MovieClip = new MovieClip();
      var circleClip:MovieClip = new MovieClip();
      circleClip.addEventListener(MouseEvent.CLICK,circleClickedEvent);
    }

    private function circleClickedEvent(e:MouseEvent):void
    {
      var wedgeHolder:MovieClip = new MovieClip();
  circleHolderRef.addChildAt(wedgeHolder,1);
      var wedge:Wedge = new Wedge(wedgeHolderRef);
  wedge.addEventListener(MouseEvent.CLICK,wedgeClickEvent);
    }



    private function wedgeClickEvent(e.target){
      trace ('click'); //NOT WORKING
    } 
  }
}

Wedge.as

package com.treediagram
{
  public class Wedge extends MovieClip  
  {
    public function Wedge(wedgeHolderRef)
    {
      var wedgeClip:MovieClip = new MovieClip();
      wedgeClip.addEventListener(Event.ADDED_TO_STAGE, wedgeAddedEvent);
      wedgeHolderRef.addChild(wedgeClip);
    }
  }
}

Я виделвопрос, похожий на этот здесь:

Как вызвать функцию в классе из другого класса?

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

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

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

Одним из решений является использование событийной связи . Когда что-то происходит в дочернем классе, оно запускает событие, которое родительский класс может решить обработать или нет.

Например:

public function Circle()  
{
  var wedge:Wedge = new Wedge();
  wedge.addEventListener(MouseEvent.CLICK, onWedgeClick);
}
private function onWedgeClick(e:MouseEvent) {
  deactiveCircle();
}
1 голос
/ 02 декабря 2011

Просто прикрепите wedgeClickHandler к члену клина из класса Circle - он получит MouseEvent очень хорошо, и он может получить доступ к закрытой функции напрямую.

0 голосов
/ 02 декабря 2011

Вы не можете вызвать Circle.deactivateCircle(), потому что его доступность установлена ​​на private и потому что ваш объект Wedge должен иметь ссылку на объект Circle, для которого вы хотите вызвать метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...