as3: Wie kopieren Sie ein Objekt von Wert
Brauche ich, um eine Instanz von einem gemeinsamen Objekt jedes andere Objekt, das ich habe. Ich mache änderungen, die auf den Werten dieses Objekt in jeder sub-Objekt, das ich habe.
Zum Beispiel. Ich habe eine Karte von Fliesen, und eine bot, die sich über Ihnen in der spezifischen Reihenfolge. Jeder bot ist die Kennzeichnung Fliesen, die war schon von ihm besucht=true. Aber im Allgemeinen möchte ich nicht Hauptkarte geändert werden...
Ich habe versucht, ein Beispiel:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
applicationComplete="complete()">
<mx:Script>
<![CDATA[
private var array:Array = new Array( 1, 2, 3, 4);
public function complete():void
{
trace("here " + array);
var a:Array = array;
a[0] = 100;
trace("here " + array);
}
]]>
</mx:Script>
</mx:Application>
Kann mir jemand helfen zu verstehen, wie kopiere ich z.B. das array per value, nicht per reference)
- Funktioniert der bot Notwendigkeit zu ändern, etwas anderes als das Boolean Feld zum abhaken, dass es seinen Abschluss besuchen?
- Nicht nur das boolean Feld in der Kachel... Das Problem ist, dass ich das Klonen der Karte von static-variable definiert, in Consts Datei... Und nichts hilft mir, es zu tun Wert... E. g. meine clone-Methode nicht helfen... ich sehe jeden bot poluting der main var
- Würde es ausreichen, wenn Sie ein multi-dimensionales array von booleans, dass Sie existiert unabhängig von den Fliesen? Es scheint nur, wie viele unnötige Redundanz, multiplizieren Sie die Anzahl der Kacheln durch die Anzahl der bots.
- Nicht sicher, wie es sein kann, unabhängig auf Fliesen? Ich meine, ich bin mit isVisited Attribut zu vermeiden, bot die Navigation zu gleichen Kachel 2 mal... Nicht sicher, wie ich vermeiden kann das kopieren...
Du musst angemeldet sein, um einen Kommentar abzugeben.
edit:
Enthält möglicherweise einige syntax-Fehler...
clone
Methode ist eigentlich ein ziemlich standard-Weg für das Klonen von komplexen Objekten.. Nur weil es nicht einige Schnittstellen, die Sie implementieren (das wäre höchst unpassend, da die clone gibt ein Objekt der besonderen Art), das bedeutet nicht, dass es falsch ist, ungewöhnliche oder jede Art von einem Rad neu erfunden.ObjectUtil
vor; Sie waren immer reden über die Serialisierung. Auch wenn Sie meine Kommentare Lesen werden Sie erneut feststellen, dass ich habe nie gesagt, dass meine Methode ist die einzige, die... Mit einem benutzerdefiniertenclone
Methode hat den großen Vorteil, dass man genau entscheiden, was kopiert werden soll, und wie es kopiert wird, und dass die Rückkehr der Typ korrekt ist (d.h. Sie brauchen nicht zu werfen). Und ja, private Variablen, die den Zugriff von innerhalb der Klasse, die in definiert sind.Zum Klonen von arrays, die Sie verwenden können,Array.Scheibe.
Hier ist eine alternative zu der beschriebenen Methode von poke:
Möchte ich zunächst einige Punkte über die poke ' s post.
"Definieren Sie Ihre eigenen Klon-Funktion für das jeweilige Objekt. Es gibt keine Besondere Funktion, also automatisch für jedes beliebige Objekt." Falsch. ActionScript hat eine eingebaute Methode zum serialisieren aufgerufen, AMF (ActionScript Message Format). AMF kann verwendet werden, um eine Kopie der nicht-primitiven Objekte.
"Mithilfe einer benutzerdefinierten clone-Methode hat den großen Vorteil, dass man genau entscheiden, was kopiert werden soll, und wie es sein wird kopiert..." Das ist genau das, was Sie tun, wenn Sie serialise ein Objekt, so dass es keinen Vorteil der benutzerdefinierten clone-Methode, dass von über serialisieren.
"...und, dass die Rückkehr der Typ korrekt ist (d.h. Sie brauchen nicht zu werfen)." Sie brauchen nicht zu werfen eine serialisierte Objekt entweder. Aber serialisieren hat den Vorteil, dass Sie generisch, so dass die Funktion zum kopieren von dynamischen, und nicht beschränkt auf bestimmte Arten.
"[Implementierung einer Schnittstelle] (das wäre höchst unpassend, da die clone gibt ein Objekt der besonderen Art)" zu definieren, eine Rückkehr geben wird das statische, die Schlösser, die Sie mit bestimmten Arten. Wenn wir die dynamischen Attribute der Sprache, die wir machen können, die einen generischen Klon-Methode und nicht Pflege zu geben. Es ist nichts unangemessenes über die.
", Dass Sie eine Kopie eines Objekts, wenn du unserialize ein serialisiertes Objekt zweimal, ist nur ein zusätzlicher Effekt der Serialisierung." Die Tatsache, Sie bekommen eine Kopie eines array durch Aufruf von slice() oder concat() ohne Argumente ist einfach ein Nebeneffekt dieser Methoden. Ich weiß nicht wirklich sehen, dein Punkt hier. Auch serialisieren kopieren in Ihrem Herzen. Der Akt der serialising dann de-serialising ist die Rechtshandlung, mit der eine Kopie. Sie nicht irgendwie bekommen, die genau die gleichen Speicher zurück, mit Referenzen und alle intakt.
Und ich habe eine Frage: Wie würden Sie umgehen mit geschachtelten nicht-primitiven Typen in der clone-Methode?
In Ihrer Frage, geben Sie "Kann jemand mir helfen, zu verstehen, wie kopiere ich z.B. das array per value, nicht per reference)" ich denke, beim kopieren von Objekten, ist es wichtig zu wissen, den Unterschied zwischen flach und deep kopiert.
Flache Kopien
Den Lösungen hier (Array.slice () und Array.concat()) sind bekannt als flach kopiert. Was Sie bekommen, ist eine Kopie des Arrays. Wenn der Inhalt des Arrays primitive Typen (diejenigen, die als Wert übergeben werden, nicht als Verweis), dann haben Sie zwei einzigartige Objekte, das original und die Kopie. Wenn man sich jedoch ein array enthält Objekte werden per Referenz übergeben, dann Sie beide, das original und die Kopie des array müssen die exakt gleiche Inhalt. Wenn Sie änderungen an einem Objekt im ursprünglichen array an, die änderungen werden in das array kopiert. Dies mag zwar manchmal, was Sie sich wünschen, ist es nicht immer.
Tiefe Kopien
Einer tiefen Kopie werden, Durchlaufen Sie die Hierarchie, der das Objekt, das Sie kopieren möchten, und machen Sie Kopien von jedem Objekt, das er findet. Sie werden dann erlaubt werden, um änderungen an dem kopierten Objekt ohne änderungen in das original übernommen.
Wenn Sie zum definieren einer benutzerdefinierten clone-Methode als Sack schlägt, dann kopieren nicht prinitive Arten wird übermäßig kompliziert. Würden Sie haben zu gehen durch die Eigenschaften des Objekts und rufen Sie eine benutzerdefinierte clone () - Methode auf jedem nicht-primitiven Typ. Jedoch, wenn Sie auftreten, wird ein built-in nicht-primitiven Typs, wie Array oder ein Dictionary, dann müsste man neu erstellen Sie das Objekt, Schleife durch seine Inhalte, und starten Sie alle immer wieder überprüfen, ob es nicht primitive, den Aufruf der clone () - Methode, wenn es einen hat, oder den Umgang mit Arrays und Dictionaries. Es wird übermäßig kompliziert. Um zusammenzufassen, diese Methode hat zwei Probleme: Sie haben für den Umgang mit Arrays und Dictionaries (und der Einbau von nicht-primitiven Typ) selbst; Sie müssen speziell Aufruf der clone-Methode auf verschachtelte Objekte (und wissen, dass Sie die clone-Methode definiert).
Andere Methode ist das verwenden von AMF für den serialise und dann de-serialise das Objekt, so dass Sie eine Tiefe Kopie. Dies funktioniert direkt aus der box für Arrays, Dictionaries und andere, nicht-primitiven, die sich auf öffentliche Liegenschaften.
Dieser deckt das erste problem mit einem custom clone-Methode und ein Punkt weiter oben. Wie Sie sehen können, werden alle Objekte und deren Inhalte kopiert wurden, mithilfe der integrierten Methoden.
Habe ich gezeigt, dass eine Umsetzung, wie das erstellen der clone-Methode hier, aber Sie können finden, in: mx.utils.ObjectUtil.
Wenn Sie wollen, um Tiefe Kopie eines Objekts, speichert seine Daten privat, dann müssen Sie implementieren, die IExternalizable-Schnittstelle. Zwingen Sie zwei Methoden implementieren:
Innerhalb dieser Funktionen, die Sie schreiben, Ihre privaten Variablen, um die Ausgabe-Objekt, Lesen Sie Sie dann aus dem Eingang, um Ihre privaten Variablen. Dann, wenn Sie anrufen Klon erhalten Sie eine vollständige Kopie des Objekts. Denken Sie daran, dies zu tun für alle verschachtelten Objekte.
Hier ist eine einfache Implementierung-Beispiel mit zwei Klassen:
Und:
Testen Sie:
Dies umfasst das zweite problem mit einem custom clone-Methode. Wie Sie sehen können, wir hatten nicht zu sorgen über den Aufruf von jedem Klon-Methoden, das hat sich alles erledigt für uns.
Ich sage nicht, es ist nicht ganz ohne Nachteile, aber es bietet einige Funktionen, die zu Tiefe Objekte kopieren.
Einige Nachteile sind:
Finden Sie unter Adobe ' s Sicht auf das kopieren von arrays: http://livedocs.adobe.com/flex/3/html/help.html?content=10_Lists_of_data_6.html
Beachten Sie auch, dass Adobe Stahlen diese Technik, die von Java.