Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-04-2007, 11:02   #1 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
Composite Iterator

Hallo,

ich versuche gerade ein Composite Beispiel von <<Head First Design Pattern>>
in AS2 umzuschreiben. Leider erhalte ich nicht die einzelnen Auflistungen.

Ich glaube mein Problem ist der Iterator vielleicht kenn jemand das Beispiel und kann mir auf die Sprünge helfen.

Danke im voraus

Java von Head First
PHP-Code:
package headfirst.composite.menuiterator;
 
import java.util.*;
  
public class 
CompositeIterator implements Iterator {
    
Stack stack = new Stack();
   
    public 
CompositeIterator(Iterator iterator) {
        
stack.push(iterator);
    }
   
    public 
Object next() {
        if (
hasNext()) {
            
Iterator iterator = (Iteratorstack.peek();
            
MenuComponent component = (MenuComponentiterator.next();
            if (
component instanceof Menu) {
                
stack.push(component.createIterator());
            } 
            return 
component;
        } else {
            return 
null;
        }
    }
  
    public 
boolean hasNext() {
        if (
stack.empty()) {
            return 
false;
        } else {
            
Iterator iterator = (Iteratorstack.peek();
            if (!
iterator.hasNext()) {
                
stack.pop();
                return 
hasNext();
            } else {
                return 
true;
            }
        }
    }
   
    public 
void remove() {
        throw new 
UnsupportedOperationException();
    }

mein AS2
PHP-Code:

class CompositeIterator implements Iterator {
    var 
stack:Stack  = new Stack();
   
    public function 
CompositeIterator(iterator:Iterator){ 
        
stack.push(iterator);
    }
    
    public function 
getStack(){ 
        return 
stack;
    }
   
    public function 
next():Object {
        
        if (
hasNext()) {
        var 
iterator:Iterator  =  Iterator(stack.peek());
             var 
component:MenuComponent =  MenuComponent(iterator.next());
            if (
component instanceof Menu) {
                
stack.push(component.createIterator());
            } 
            return 
component;
        } else {
            return 
null;
        }
    }
  
    public function  
hasNext():Boolean {
    
        if (
stack.isEmpty()) {
            return 
false;
        } else {
            var 
iterator:Iterator =  Iterator(stack.peek());
            if (!
iterator.hasNext()) {
            
                
stack.pop();
                return 
hasNext();
            } else {
                return 
true;
            }
        }
    }
   
    public function 
remove():Void {
        
//throw new UnsupportedOperationException();
    
}

__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet
ge_flash ist offline   Mit Zitat antworten
Alt 11-04-2007, 11:09   #2 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
Anbei nochmal das ganze Projekt:
Angehängte Dateien
Dateityp: zip classes.zip (12,6 KB, 3x aufgerufen)
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet
ge_flash ist offline   Mit Zitat antworten
Alt 11-04-2007, 11:20   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
  1. Stack sicherheitshalber im Konstruktor definieren.
  2. Wo bekommst du in AS deinen Stack her?
Für das ganz Projekt habe ich gerade keine Zeit. was macht den so ein Composite Iterator?
Omega Psi ist gerade online   Mit Zitat antworten
Alt 11-04-2007, 11:25   #4 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
das ist meine Stack Klasse:
PHP-Code:
class Stack
{
        private var 
stack:Array;
        
        public function 
Stack()
        {
                
this.stack = new Array();
            
        }
        
        public function 
push(obj:Object):Void
        
{
                if(
obj != null && obj != undefinedstack.push(obj);
        }
        
        public function 
pop():Object
        
{
                if(!
this.isEmpty()) return stack.pop();
                
                return 
null;
        }
        
        public function 
peek():Object
        
{
                if(!
this.isEmpty()) return stack[stack.length 1];
                
                return 
null;
        }
        
        public function 
isEmpty():Boolean
        
{
                return 
stack.length == 0;
        }
        
        public function 
size():Number
        
{
                return 
stack.length;
        }
        
        public function 
toString():String
        
{
                var 
tmp:Array = stack.concat();
                
tmp.reverse();
                return 
tmp.toString();
        }

ich versuche den CI so aufzurufen aber er übergibt nur undefined.

PHP-Code:
...
    public function 
createIterator():Iterator {
        
trace("create");
    
//    return new CompositeIterator(menuComponents.iterator());
    
            
return new CompositeIterator(menuComponents.iterator());
        
//return new ArrayIterator(menuComponents.iterator());
    
}
... 
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet
ge_flash ist offline   Mit Zitat antworten
Alt 11-04-2007, 11:30   #5 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
Achso, soweit ich es verstehe hangelt sich der CompositeIterator durch eine Baumstruktur bis zum letzten Blatt. Egal ob da Arrays,Hashtables,ArrayList etc.. drin sind.
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet
ge_flash ist offline   Mit Zitat antworten
Alt 11-04-2007, 11:36   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
Und was ist mit dem
Code:
    ...     public function createIterator():Iterator {         trace("create");         //return new CompositeIterator(menuComponents.iterator());         trace(menuComponents.iterator()); // <- was sagt der?         return new CompositeIterator(menuComponents.iterator());         //return new ArrayIterator(menuComponents.iterator());     } ...
Omega Psi ist gerade online   Mit Zitat antworten
Alt 11-04-2007, 11:39   #7 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
undefined.
Da liegt wohl der Hund begraben.
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet
ge_flash ist offline   Mit Zitat antworten
Alt 11-04-2007, 11:39   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
Liegt nahe... viel Glück.
Omega Psi ist gerade online   Mit Zitat antworten
Alt 12-04-2007, 12:35   #9 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
Zitat:
trace(menuComponents.iterator());
Methode ist in Java im Collection Interface definiert. In AS3 wirds die wohl nicht geben?
__________________
elias ist offline   Mit Zitat antworten
Alt 12-04-2007, 12:38   #10 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
ok, weisst Du denn wie diese aussieht.

Hab nachgeschaut, dass muss ich wohl in meiner ArrayList einbauen!?:

Iterator
iterator()
Returns an iterator over the elements in this collection.
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet

Geändert von ge_flash (12-04-2007 um 12:44 Uhr)
ge_flash ist offline   Mit Zitat antworten
Alt 12-04-2007, 19:52   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Erstmal sind da einige fundamentale Sachen falsch.
Zum einen initialisierst du mehrmals im Klassenrumpf Instanzvariablen, was nicht zulässig ist. Beispielsweise in der Menu-Klasse (Zeile 8):
PHP-Code:
    var menuComponents:Array = new Array(); 
In Flash würdest du dafür einen Fehler bekommen. Die Initialisierung im Klassenrumpf ist nur für statische Variablen erlaubt, normale Instanzvariablen solltest du immer im Konstruktor initialisieren.

Folgende Zeilen in der Menu-Klasse (print Methode) erscheinen mir auch seltsam:
PHP-Code:
var iterator:Iterator= new CompositeIterator();
  
iterator  menuComponents.iterator(); 
Zum einen weißt du der lokalen Variable einmal eine neue CompositeIterator-Instanz zu, direkt danach überschreibst du sie aber mit derm Rückgabewert von menuComponents.iterator. Und zu guter letzt ist menuComponents auch noch ein stinknormales Array, d.h. es hat mit Sicherheit keine iterator-Methode. (dementsprechend kommt da auch undefined raus). Warum MTASC da allerdings keinen Fehler meldet verstehe ich nicht.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 12-04-2007, 21:06   #12 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
Vielen Dank

Ups... das mit dem Rumpf ist mir garnicht aufgefallen.

Ja, ich habe noch einige verständniss Probleme mit diesem Pattern.
Bin nochmal zurück gegagen und habe mich mit dem Iterator beschäftigt.
Jetzt bekomme ich auch gescheite Werte, es geht voran

Danke für Eure Hilfe, werde bestimmt hier noch oft hängen bis ich das durch habe.

Immerhin soll man ja mit Design-Pattern für immer glücklich sein
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet

Geändert von ge_flash (12-04-2007 um 21:08 Uhr)
ge_flash ist offline   Mit Zitat antworten
Alt 13-04-2007, 10:29   #13 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
Zitat:
Zitat von ge_flash Beitrag anzeigen
Immerhin soll man ja mit Design-Pattern für immer glücklich sein
Ich habe noch nie welche bewusst eingesetzt und mir geht es blendend...
Omega Psi ist gerade online   Mit Zitat antworten
Alt 13-04-2007, 16:59   #14 (permalink)
ketten_karusell_
 
Benutzerbild von ge_flash
 
Registriert seit: Jan 2002
Ort: Duitsland geen Westen
Beiträge: 1.245
So ich habe das Composite-Pattern fertig, falls noch jemand es brauch einfach hier rein posten.

jetzt noch ein Observer-Pattern und Strategy-Pattern und dann das MVC fertigstellen.

Dann gehts mir hoffentlich auch blendend
__________________
-----------------------------------------------
wichtige Befehle:
-format internet
-fdisk internet
ge_flash ist offline   Mit Zitat antworten
Alt 13-04-2007, 17:40   #15 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
Wieso codest du die Patterns für ein nacktes MVC?
Omega Psi ist gerade online   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele