Возвращение к родителю из дочернего объекта - PullRequest
2 голосов
/ 13 сентября 2008

Мой вопрос касается наилучшей практики доступа к родительскому объекту дочернего объекта. Допустим, класс создает экземпляр другого класса, на этот экземпляр класса теперь ссылается объект. Из этого дочернего объекта, каков наилучший способ вернуться к родительскому объекту? В настоящее время я знаю пару способов, которыми я часто пользуюсь, но я не уверен, есть ли А) лучший способ сделать это или Б), какой из них лучше использовать

Первый метод заключается в использовании getDefinitionByName, который не будет создавать экземпляр этого класса, но разрешать доступ ко всему внутри него, который был публично объявлен.

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

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

_class(parent.parent).function();

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

Я также могу получить следующий оператор для отслеживания [object ClassName] в выводе Flash.

trace(Class);

Я не на 100% использую эту строку, я не убедил ее как способ ссылаться на объект за пределами текущего объекта, в котором я нахожусь.

Другой метод, который я видел, - это просто передать ссылку на него в объект класса, который вы создаете, и просто перехватить его с помощью аргумента конструктора

var class:Class = new Class(this);  

и затем в файле класса

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

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

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

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

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

Мне просто не хватает чего-то действительно очевидного. Я в основном ищу подтверждение, являются ли это правильными способами ссылки на родителя, и если да, то какой из них наиболее идеален, или я пропускаю что-то еще?

Ответы [ 6 ]

7 голосов
/ 16 сентября 2008

В общем, если вам нужен ребенок для общения с родителем, вы должны смотреть на это, передавая события. Это отделяет ребенка от родителя и позволяет другим классам работать с ребенком.

Я бы не рекомендовал передавать ссылку на родительский класс в дочерний.

Вот простой пример (я протестировал / скомпилировал это, так что могут быть некоторые опечатки).

//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");
        }

    }
}

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

В основном:

Родитель имеет ссылку на Child и общается через вызовы методов. Ребенок не имеет ссылки на Родителя и общается (с кем бы то ни было) посредством отправки событий.

надеюсь, что это поможет ...

микрофонные камеры

mesh@adobe.com

3 голосов
/ 13 сентября 2008

Обычно хорошо иметь класс в качестве своего собственного экземпляра и уменьшать тесную связь с чем-то другим (как в данном случае, это родитель). Если вы делаете что-то вроде parent.doSomething (), то невозможно использовать этот класс в контейнере, у которого нет метода doSometing (). Я думаю, что определенно лучше передать все, что может понадобиться классу, а затем внутри класса больше не нужно делать parent.parent и т. Д.

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

Третий вариант, который у вас здесь есть, также очень отличается, это доступ к статическому методу уровня класса (вам не нужно вводить весь путь к классу при доступе к этому методу), а не метод экземпляра, как в первых двух.

1 голос
/ 15 сентября 2008

Мне нравится настраивать глобальный класс для обработки ссылок на классы, к которым должен обращаться любой другой класс, не обязательно дочерний.

Глобальный класс просто состоит из статических геттеров и сеттеров, например:

private static const class:Class;

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

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

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

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

1 голос
/ 13 сентября 2008

Мне нравится передавать родительский элемент как интерфейс (чтобы класс мог содержаться в любом родительском элементе, реализующем этот интерфейс) или реализовывать ссылку как указатель / делегат события / функции, к которому родительский элемент может подключаться.

1 голос
/ 13 сентября 2008

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

0 голосов
/ 03 июля 2009

Если эти объекты находятся в DisplayList, у вас есть еще несколько вариантов. Если у меня есть ParentClass и ChildClass, в дочернем классе вы, кажется, сможете получить доступ к родителю, если вы приведете запрос в качестве ParentClass. например

ParentClass(parent).parentFunction();

Я точно знаю, что это работает, если ParentClass является классом документов. Поскольку Класс документа всегда является первым элементом в списке отображения, это работает:

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

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

Конечно, 'parent' и 'getChild ...' работают, только если эти объекты есть в DisplayList, но для меня этого было достаточно.

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