2

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

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

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

然后根据其父到子层次结构引用该变量。
例如,如果孩子试图引用一个比自己高两级的类:

_class(parent.parent).function();

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

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

trace(Class);

我不是 100% 地执行那条线,我没有说服它作为引用我所在的当前对象之外的对象的一种方式。

我见过的另一种方法是简单地将 this 的引用传递给您正在创建的类对象,然后用构造函数参数捕获它

var class:Class = new Class(this);  

然后在Class文件中

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

但是,该引用还要求您使用子层次结构向后退到父层次结构。

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

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

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

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

4

6 回答 6

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 的引用,并通过调度事件(与任何人)进行通信。

希望有帮助...

迈克室

网格@adobe.com

于 2008-09-15T22:09:49.803 回答
3

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

有了这个,如果您将来想要更改结构,只需传入一个新的引用就很容易了;子类的实现根本不需要改变。

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

于 2008-09-13T08:27:47.580 回答
1

我一直使用您的第二种方法,将指向父对象的指针传递给子对象并将该指针存储在子类的成员变量中。对我来说,这似乎是孩子与父母交流的最简单方法。

于 2008-09-12T22:12:01.147 回答
1

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

于 2008-09-13T08:57:07.993 回答
1

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

全局类仅由静态 getter 和 setter 组成,如下所示:

private static const class:Class;

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

这样做的好处是您不必导入从全局类返回的类,只需导入全局类本身。

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

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

于 2008-09-15T15:44:52.287 回答
0

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

ParentClass(parent).parentFunction();

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

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

就我而言,它们都是同一个包的成员,所以我什至不需要导入任何东西。我没有在所有情况下都测试过它,但是当我需要它时它可以工作。

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

于 2009-07-03T01:52:04.360 回答