从子对象引用回父对象

时间:2008-09-12 21:55:24

标签: flash actionscript-3

我的问题与访问子对象父级的最佳实践有关。因此,假设一个类实例化另一个类,该类实例现在用一个对象引用。从那个子对象,引用回父对象的最佳方法是什么?目前我知道我经常使用的几种方式,但我不确定A)是否有更好的方法可以做到这一点或B)哪一种是更好的做法

第一种方法是使用getDefinitionByName,它不会实例化该类,但允许访问公开声明的内部任何内容。

_class:Class = getDefinitionByName("com.site.Class") as Class;

然后根据其父级到子级别引用该变量 例如,如果孩子试图引用一个比自身高两级的类:

_class(parent.parent).function();

这似乎工作正常,但您需要知道孩子所处的等级与您尝试访问的父级别相比。

我还可以使用以下语句将[object ClassName]追踪到Flash的输出中。

trace(Class);

我不是百分之百地执行该行,我没有把它作为一种方法来引用我当前对象之外的对象。

我看到的另一种方法是简单地将对此的引用传递给您正在创建的类对象,并使用构造函数参数捕获它

var class:Class = new Class(this);  

然后在类文件中

public function Class(objectRef:Object) {
    _parentRef = objectRef;
} 

该引用还要求您使用子级到父级层次结构进行备份。

我也可以导入该类,然后使用直接文件路径引用该类内部的方法,无论其是否为父类。

import com.site.Class;
com.site.Class.method();

当然,父子关系是无关紧要的,因为我直接通过导入的类访问方法或属性。

我觉得我错过了一些非常明显的东西。我基本上是在寻找确认,如果这些是引用父母的正确方法,如果是这样,哪个是最理想的,还是我过分看待其他东西?

6 个答案:

答案 0 :(得分:7)

一般而言,如果您需要孩子与父母沟通,您应该通过广播事件来考虑这样做。这使得孩子与父母脱钩,并且可以让其他班子与孩子一起工作。

我不建议将对父类的引用传递给子代。

这是一个简单的例子(我已经测试/编译了这个,所以可能会有一些拼写错误。)

//Child.as
package
{
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class Child extends EventDispatcher
    {
        public function doSomething():void
        {
            var e:Event = new Event(Event.COMPLETE);
            dispatchEvent(e);
        }

        public function foo():void
        {
            trace("foo");
        }
    }
}


//Parent.as
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    public class Parent extends Sprite
    {
        private var child:Child;
        public function Parent():void
        {
            c = new Child();
            c.addEventListener(Event.COMPLETE, onComplete);
            c.foo();//traces foo

            c.doSomething()
        }

        public function onComplete(e:Event):void
        {
            trace("Child broadcast Event.COMPLETE");
        }

    }
}

在大多数情况下,您将调度自定义事件并使用它们传递数据。

基本上:

Parent引用了Child并通过方法调用进行通信。 Child没有引用Parent,并通过调度事件与任何人进行通信。

希望有所帮助...

迈克室

mesh@adobe.com

答案 1 :(得分:3)

将类作为它自己的实例并减少与其他东西的紧密耦合通常是好的(在这种情况下,它是它的父级)。如果您执行parent.doSomething()之类的操作,则无法在没有doSometing()方法的容器中使用该类。我认为最好传入类可能需要的任何内容,然后在类中,它不再需要任何parent.parent等。

有了这个,如果你将来想要改变结构,很容易传入一个新的参考;子类的实现根本不需要改变。

你在这里的第三个选择也非常不同,它访问类级静态方法(访问该方法时不必键入整个类路径),而不是前两个中的实例方法。 / p>

答案 2 :(得分:1)

我总是使用你的第二种方法,将指向父对象的指针传递给子节点,并将该指针存储在子类的成员变量中。对我而言,这似乎是孩子与父母沟通的最简单方法。

答案 3 :(得分:1)

我喜欢将父接口作为接口传递(因此该类可以包含在实现该接口的任何父接口中),或者将引用实现为父接口可以挂接的事件/函数指针/委托。

答案 4 :(得分:1)

我喜欢设置一个全局类来处理对任何其他类(不一定是孩子)需要访问的类的引用。

全局类只包含静态getter和setter,如下所示:

private static const class:Class;

public static function setClass(_class:Class){
class = _class;
}
public static function getClass(void):Class{
return class;
}

关于这一点的好处是你不必导入从全局类返回的类,只需要导入全局类本身。

需要引用的类将自身添加到全局列表中。 另一件很酷的事情是,您可以轻松地从这个集中位置发送事件。

大多数情况下,如果一个类需要被子类或任何其他类引用,我是通过一个接口来实现的。

答案 5 :(得分:0)

如果这些对象在DisplayList中,那么您还有更多选项。如果我有一个ParentClass和一个ChildClass,那么在子类中,如果将请求转换为ParentClass,您似乎可以访问父类。例如

ParentClass(parent).parentFunction();

如果ParentClass是Document Class,我肯定知道它是有效的。由于文档类始终是显示列表中的第一项,因此可以使用:

ParentClass(stage.getChildAt(0)).parentFunction();

在我的情况下,他们都是同一个包的成员,所以我甚至不需要导入任何东西。我没有在所有情况下测试它,但它在我需要它时起作用。

当然,'parent'和'getChild ...'只有在这些对象位于DisplayList中时才有效,但这对我来说已经足够了。