Einsatz von Behavior und Arbitrator

FaxXer

Mitglied
Ich teile den Aufruf mal in zwei. Macht aber genau das selbe, ist aber wahrscheinlich verständlicher.

Java:
Behavior b3;
Hiermit hast du nur gesagt, dass die Variable b3 vom Typ Behavior ist. Eine ganz normale Variablenzuweisung.

Java:
b3 = new Exit();
Hier legst du nun das Objekt Exit an und speicherst die Referenz darauf in der Variablen b3. Du hast aber nun nur ein Objekt und benutzt es noch nicht!
Um es zu benutzten musst du jetzt auf die Methoden des Objektes mit dem . Operator zugreifen.

In einer Zeile ist es dann eben dies:
Java:
Behavior b3 = new Exit();
 

starter400

Neues Mitglied
Das würde dann also bedeuten, dass ich schreiben müsste:

Java:
		Behavior b6 = new Vorwaerts.takeControl();
		Behavior b5 = new Exit.takeControl();
		Behavior b1 = new BlackLine.takecontrol();
		Behavior [] array = {b1, b5, b6};
		Arbitrator arby = new Arbitrator(array);
		arby.start();

Oder?
Die 3 Methoden takeControl existieren in den jeweilige Klassen.

Grüße,
Ingo
 
Zuletzt bearbeitet:

akimoon

Aktives Mitglied
Hm.. naja, zumindest fast :)

mit "new XXY()" kannst du immer ein Objekt einer Klasser erzeugen.
Es wird hierbei ein Konstruktur aufgerufen, der das Objekt für dich erzeugt (Ein Konstruktur hat den namen der klasse und keinen Rückgabewert)
Zum Beispiel lässt sich ein Stuhl der Klasse
Java:
public class Stuhl{
   public Stuhl(){ //Konstruktor
   }

   public void rueckeStuhl(){ //normale Methode
   }
}
mittels
Java:
... 
Stuhl stuhl = new Stuhl();
....
erzeugen. Um den Stuhl dann zu bewegen ruft man die Methode rueckeStuhl() des Objekts auf
Java:
...
stuhl.rueckeStuhl();
...


Um endgültig aber zu sagen, was bei dir der Fehler ist, müsste man wissen, wie die Klassen Vorwaerts, Exit etc aufgebaut sind. (Ist takeControl() eine statische Methode? Was liefert sie zurück?...) :)
Hoffe das war halbwegs verständlich
 

Krissi86

Neues Mitglied
Hallo,

Also mit Hilfe des Behaviors sollen quasi parallele Vorgänge realisiert werden.
Der Arbitrator verwaltet die unterschiedlichen Behaviors und läuft sie ständig ab und schaut ob eine TakeControl() Bedingung wahr wird. Dabei wird jeweils die mit dem niedrigsten Array-Index als erstes untersucht.
TakeControl überprüft also ob eine die Methode action() der Behaviorklasse ausgeführt wird oder nicht.
In diesem Zusammenhang und unter Berücksichtigung der API für Behavior und Arbitrator scheint mir ein expliziter Aufruf der takeControl()- Methode wenig sinnvoll.
Jedoch ist mir ebenfalls nicht klar was wir falsch machen.

Hier mal der Auszug aus der API für Arbitrator und ebenfalls eine Beispielmethode Exit() für den Überblick über den Aufbau des Behaviors:

Arbitratoraufruf:
Java:
public void start() {

        while (running) {
            // Find triggered behavior with highest priority
            int highest = 0;
            for(int i=0;i< behavior.length;i++) {            
                if(behavior[i].takeControl()) highest = i;
            }

            if ( currentBehavior == NONE | actionThread.done ) {
                // No active behavior, make highest priority behavior active
                currentBehavior = highest;
                actionThread.execute(highest);
            }
            else if ( highest == currentBehavior & actionThread.done) {
                // Only restart currentBehavior when it is done
                actionThread.execute(highest);
            }
            else if ( currentBehavior < highest){
                // A higher priority behavior is triggered while a lower priority
                //    behavior is active

                actionThread.interrupt();                
                currentBehavior = highest;
                actionThread.execute(highest);
            }
            Thread.yield();
        }
    }

Und hier die Klasse Exit():

Java:
import lejos.robotics.subsumption.*;
import lejos.nxt.*;



public class Exit implements Behavior{
    
    
    public boolean takeControl(){
        
        return Button.ESCAPE.isPressed();
    }
    
    public void action(){
        LCD.refresh();
        LCD.drawString("action Exit",0,1);
        System.exit(0);
    }
    
    public void suppress(){
        
    }

}
 

Ähnliche Java Themen

Neue Themen


Oben