flash as3调用函数在另一个子类的一个子类中

时间:2011-12-01 21:50:51

标签: flash actionscript-3 class singleton

我正在尝试从另一个子类(Wedge.as)调用一个子类(Circle.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);
    }
  }
}

我在这里看到了类似的问题:

How to call a function in a Class from another Class?

但由于它与我的问题有关,因此有点难以理解。其中一个解决方案有效,但被评为坏形式,另一个无效,所以我想确保正确构建代码。

3 个答案:

答案 0 :(得分:2)

通常,父类可以知道它的子节点,但不是相反。如果你不遵循这个原则,你最终会创建Circular dependencies并最终得到紧密耦合且难以维护的代码。关键是要防止孩子直接调用其父方法。

一种解决方案是使用event-based communication。当子类中发生某些事情时,它会触发父类可能选择处理的事件。

例如:

public function Circle()  
{
  var wedge:Wedge = new Wedge();
  wedge.addEventListener(MouseEvent.CLICK, onWedgeClick);
}
private function onWedgeClick(e:MouseEvent) {
  deactiveCircle();
}

答案 1 :(得分:1)

只需将CirclegeClickHandler附加到Circle类中的wedge成员 - 它就会很好地接收MouseEvent,它可以直接访问私有函数。

答案 2 :(得分:0)

您无法调用Circle.deactivateCircle(),因为其可访问性设置为private,并且您的Wedge对象需要引用您要调用的Circle对象方法。