2008-09-12 3 views
2

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

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

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

И затем ссылается на эту переменную на основе ее родительской иерархии.
Например, если ребенок пытается ссылаться на класс, это два уровня вверх от себя:

_class(parent.parent).function(); 

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

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

trace(Class); 

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

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

var class:Class = new Class(this); 

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

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

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

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

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

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

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

+0

Я уверен, что вы не можете иметь класс под названием Class, но я знаю, что вы имеете в виду. – Iain 2009-07-03 08:48:45

ответ

3

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

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

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

+0

Да, для третьей альтернативы я упоминаю, что, поскольку я импортирую класс, у ребенка нет родительских отношений, спасибо! – vanhornRF 2008-09-14 20:28:49

1

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

1

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

1

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

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

private static const class:Class; 

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

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

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

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

+0

С глобальным классом, который вы описываете выше, если он находится в той же папке пакета, что и классы, к которым он относится, вам также не нужно импортировать это, он должен быть доступен с помощью класса ClassName.setClass (класс); – vanhornRF 2008-09-15 16:22:42

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

    } 
} 

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

В основном:

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

надежда, что помогает ...

Майк камеры

[email protected]

0

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

ParentClass(parent).parentFunction(); 

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

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

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

Конечно, «родительский» и «getChild ...» работают только в том случае, если эти объекты находятся в DisplayList, но это было достаточно для меня.

Смежные вопросы