Frage

Meine Frage an die beste Praxis in Bezug für ein Kind des übergeordneten Objektes zugreifen. Sagen wir also eine Klasse eine andere Klasse instanziiert, wird diese Instanz der Klasse jetzt mit einem Objekt referenziert. Von diesem Kind-Objekt, was ist der beste Weg, um das übergeordnete Objekt zu verweisen zurück? Derzeit weiß ich von ein paar Möglichkeiten, die ich häufig verwenden, aber ich bin nicht sicher, ob A) es ein besserer Weg, es zu tun ist, oder B), welche von ihnen ist die bessere Praxis

Die erste Methode ist getDefinitionByName zu verwenden, die diese Klasse nicht instanziiert würden, sondern in der es den Zugang zu etwas erlauben, die öffentlich erklärt wurden.

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

Und verweisen dann die Variable auf der Grundlage seiner Eltern auf das Kind-Hierarchie.
Beispiel, wenn das Kind versucht, eine Klasse zu verweisen, die von mir selbst zwei Ebenen nach oben ist:

_class(parent.parent).function();

Das scheint gut zu funktionieren, aber Sie sind erforderlich, um das Niveau zu wissen, bei dem das Kind auf das Niveau des Mutter im Vergleich ist, dass Sie versuchen, zuzugreifen.

Ich kann auch die folgende Anweisung erhalten zu verfolgen [Objekt Classname] in Flashs Ausgabe.

trace(Class);

Ich bin nicht 100% über die Umsetzung dieser Linie habe ich es nicht als ein Weg weiter verfolgt ein Objekt außerhalb des aktuellen Objekts zu verweisen in ich bin.

Eine andere Methode, die ich verwendet habe gesehen, ist einfach zu dieser einen Verweis übergeben in das Klassenobjekt erstellen und es nur mit einem Konstruktor Argument fangen

var class:Class = new Class(this);  

und dann in der Klassendatei

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

In diesem Verweis erfordert, dass Sie auch wieder nach oben Schritt obwohl das Kind übergeordneter Hierarchie verwendet wird.

Ich kann auch diese Klasse importiere und dann die direkten Filepath verwenden, um eine Methode innerhalb der Klasse zu verweisen, unabhängig von ihrer Eltern- oder nicht.

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

Natürlich gibt es die Eltern-Kind-Beziehung ist irrelevant, weil ich die Methode oder Eigenschaft direkt durch die importierte Klasse bin erreichbar.

Ich fühle mich wie ich etwas wirklich offensichtlich hier bin fehlt. Ich suche im Grunde eine Bestätigung, wenn diese die richtigen Wege sind, um die Eltern zu verweisen, und wenn ja, welche ist die idealste, oder bin ich mit Blick über etwas anderes?

War es hilfreich?

Lösung

Es ist im Allgemeinen gut, die Klasse zu haben, wie es eigene Instanz ist und enge Kopplung zu etwas reduziert sonst (wie in diesem Fall, es ist Elternteil). Wenn Sie so etwas wie parent.doSomething () zu tun ist es nicht möglich, diese Klasse in Behältern zu verwenden, die nicht den doSometing () -Methode hat. Ich denke, es ist auf jeden Fall besser in was auch immer passieren die Klasse kann in der Klasse brauchen, und dann macht es keinen parent.parent usw. zu tun haben, nicht mehr.

Mit diesem, wenn Sie in Zukunft wollen die Struktur ändern, ist es sehr einfach, nur in einem neuen Verweise übergeben; die Umsetzung der Kinderklasse muss nicht ändern.

Die dritte Alternative, die Sie hier haben, ist auch sehr unterschiedlich, es ist ein Klassenstufe statische Methode Zugriff auf (man muss die ganze Klasse Pfad nicht eingeben, wenn diese Methode zugreifen), keine Instanz Verfahren wie in den ersten beiden.

Andere Tipps

Im Allgemeinen, wenn Sie ein Kind müssen mit einem Elternteil zu kommunizieren, sollten Sie schauen es durch Rundfunk Ereignisse, tut dies auf hat. Dies entkoppelt das Kind für die Eltern, und macht es möglich, andere Klassen mit dem Kind arbeiten zu lassen.

Ich würde nicht empfehlen, zu der übergeordneten Klasse in das Kind in einem Referenzgeben.

Hier ist ein ein einfaches Beispiel (ich habe getestet / kompiliert diese so kann es einige Fehler sein).

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

    }
}

In den meisten Fällen würden Sie benutzerdefinierte Ereignisse versenden und übergeben mit ihnen Daten aus.

Grundsätzlich gilt:

Elternteil hat Bezug auf Kinder- und kommuniziert über Methodenaufrufe. Kind muss nicht Bezug auf die Eltern, und in Verbindung steht (jedem) über Dispatching Ereignisse.

Hoffnung, die hilft ...

mike Kammern

mesh@adobe.com

Ich habe immer Ihre zweite Methode, vorbei an einen Zeiger auf das übergeordnete Objekt für das Kind und zu speichern, die Zeiger in einer Membervariable in der Kind-Klasse verwendet. Für mich scheint die einfachste Methode, um für das Kind zu den Eltern zu kommunizieren zurück.

Ich mag die übergeordneten als Schnittstelle zu übergeben (so kann die Klasse in jeder Mutter enthalten sein, die Schnittstelle implementiert) oder die Referenz als Ereignis / Funktionszeiger / Delegierten implementieren, die die Mutter kann auf einzuhaken.

Ich mag eine globale Klasse einrichten, um Verweise auf Klassen zu behandeln, die von einer anderen Klasse zugegriffen werden muss, die nicht unbedingt das Kind.

Die globale Klasse einfach besteht aus statischen Getter und Setter wie folgt:

private static const class:Class;

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

Das Schöne daran ist, dass Sie Sie von der globalen Klasse zurückkehren, nicht die Klasse importieren müssen, nur die globale Klasse selbst.

Die Klasse, auf die verwiesen werden muss, fügt sich zu der globalen Liste. Die andere coole Sache ist, dass man leicht Events von diesem zentralen Standort aus versenden kann.

Die meiste Zeit, wenn eine Klasse von Kind-Klassen oder jeder anderen Klasse verwiesen werden muss, ich tue es über eine Schnittstelle.

Wenn diese Objekte in der Displaylist sind, dann haben Sie einige weitere Optionen. Wenn ich einen Parent und Child, in der Kind-Klasse haben, scheinen Sie in der Lage zu sein, den Eltern zugreifen, wenn Sie die Anfrage als Parent werfen. z.B.

ParentClass(parent).parentFunction();

Ich weiß sicher, es funktioniert, wenn der Parent die Dokumentenklasse ist. Da die Dokumentenklasse immer das erste Element in der Anzeigeliste befindet, das funktioniert:

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

In meinem Fall waren sie beiden Mitglieder des gleichen Pakets, so dass ich nicht einmal etwas zu importieren. Ich habe es nicht unter allen Umständen getestet, aber es funktionierte, als ich es brauchte.

Natürlich ‚Eltern‘ und ‚getChild ...‘ nur funktionieren, wenn diese Objekte in der Displaylist sind, aber das ist schon gut genug für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top