[ev3 × Java] Schnittstelle, Implementierung und Vererbung (Ereignisverarbeitung)

In diesem Artikel werden wir uns hauptsächlich mit der Funktion Schnittstelle mit Robotern befassen.

Inhaltsverzeichnis

  1. Was ist eine Schnittstelle?
  2. Codestruktur 1-0. Beispielcode zum Implementieren der Verarbeitung in der Schnittstelle 1-1. Beispielcode zum Erstellen einer Klasse und Implementieren einer Schnittstelle
  3. Beispielcode für die Schnittstelle TimerListnener und die Implementierungsklasse Timer
  4. Beziehung zwischen Motorklasse und Schnittstelle in leJOS

0. Was ist eine Schnittstelle?

Die Schnittstelle ist wie eine Klasse, die nur ** Methodenspezifikationen ** definiert. Die Methoden sind in der Schnittstelle aufgelistet, aber ihre ** Verarbeitung ** ist nicht geschrieben.

Wenn Sie sich also eine Methode ansehen, wissen Sie, was sie tut, aber was sie tatsächlich tut. Sie können sehen, was die Methode tut, indem Sie in die ** Klasse schauen, die die Schnittstelle ** implementiert.


Punkt: ** Schnittstelle ** Definieren Sie nur die Methodenspezifikationen (Rückgabewert, Methodenname, Argumente). Wird nicht wirklich verarbeitet


Punkt: ** Klasse, die die Schnittstelle implementiert ** Definieren Sie den Verarbeitungsinhalt der Methode Eigentlich verarbeiten


[Referenzartikel] Implementierte Schnittstelle! Verwendung von Geräten in Java


1. Codestruktur

1-0. Beispielcode zum Implementieren der Verarbeitung in der Schnittstelle

Schauen wir uns zunächst den folgenden Code an. Es ist ein Programm, das Zeichen zu Beginn und am Ende der Motordrehung anzeigt.

MotorEvent.java


import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;
import lejos.utility.Delay;

public class MotorEvent{
	
	//Instanzgenerierung
	//RegulatedMotor:Schnittstelle
	//EV3LargeRegulatedMotor:Klasse, die die Schnittstelle implementiert
	private static RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);
	
	public static void main(String[] args) {
		
		//Instanzgenerierung
		//Passen Sie die Methoden in der Schnittstelle RegulatedMotorListener an, um den Prozess zu definieren
		final RegulatedMotorListener listener = new RegulatedMotorListener() {
			
			//Passen Sie die folgenden zwei Methoden der Schnittstelle RegulatedMotorListener an
			
			//Passen Sie die Methode an, die aufgerufen wird, wenn sich der Motor dreht
			@Override
			public void rotationStarted(
					final RegulatedMotor motor,
					final int tachoCount,
					final boolean stalled,
					final long timeStamp) {
				//Was anpassen
				System.out.println("Started");
				Delay.msDelay(500);
			}
			//Passen Sie die Methode an, die aufgerufen wird, wenn sich der Motor nicht mehr dreht
			@Override
			public void rotationStopped(
					final RegulatedMotor motor,
					final int tachoCount,
					final boolean stalled,
					final long timeStamp) {
				//Was anpassen
				System.out.println("Stopped");
				Delay.msDelay(500);

			}
				
		};
		
		//Die addListener-Methode verwendet eine Instanz von RegulatedMotorListener als Argument
		//Wenn sich der Motor bewegt, wird dies dem Hörer mitgeteilt
		//Und die Methode im Listener wird aufgerufen
		l_a.addListener(listener);
		l_a.forward();
		Delay.msDelay(2000);
		l_a.stop();		
		Delay.msDelay(500);
		
	}
}

Beispielcodeübersicht

  1. Ich möchte die ** addlistener-Methode ** verwenden, um Zeichen zu Beginn und am Ende der Motordrehung ** anzuzeigen. ※void addListener(RegulatedMotorListener listener) Fügen Sie ein Listener-Objekt hinzu, das Sie benachrichtigt, wenn die Drehung beginnt oder stoppt

  2. Die Methode addlistener ist in der Klasse EV3LargeRegulatedMotor implementiert. Erstellen Sie daher ** eine Referenztypvariable l_a und verwenden Sie sie in Form von l_a.addlistener **.

  3. Da die Methode addlistener eine Instanz der ** Schnittstelle RegulatedMotorListener ** als Argument verwendet, muss zunächst eine Instanz aus dieser ** Schnittstelle ** erstellt werden.

  4. Da die Schnittstelle ** jedoch die Verarbeitung der Methode ** nicht definiert, selbst wenn eine Instanz erstellt wird, ** kann die Verarbeitung nicht tatsächlich ausgeführt werden **. Passen Sie daher ** die Methode in der Schnittstelle an, um den Prozess zu definieren **, damit der Prozess ausgeführt werden kann.


Beispielcode organisieren

◯ Schnittstelle: ** Geregelter Motor ** Implementierungsklasse: EV3LargeRegulatedMotor

◯ Schnittstelle: ** RegulatedMotorListener ** Implementierungsklasse: Keine (innerhalb der Schnittstelle implementiert)

◯ Methode: ** rotationStarted () ** In RegulatedMotorListener sind nur Spezifikationen definiert Methode, die aufgerufen wird, wenn sich der Motor zu drehen beginnt

◯ Methode: ** rotationStopped () ** In RegulatedMotorListener sind nur Spezifikationen definiert Methode, die am Ende der Motordrehung aufgerufen wird

◯ Methode: ** addlistener () ** void addListener(RegulatedMotorListener listener) Als Argument wird ein von der Schnittstelle ** generiertes Objekt ** verwendet. Die Spezifikationen werden in der Schnittstelle RegulatedMotor definiert und in der Klasse EV3LargeRegulatedMotor implementiert.


1-0. Beispielcode zum Erstellen einer Klasse und Implementieren einer Schnittstelle

◯ Erstellen Sie selbst eine Klasse namens RotateStateEvent, um die Schnittstelle RegulatedMotorListener zu implementieren. Passen Sie darin die Methode in RegulatedMotorListener an, um den Prozess zu definieren.

MotorEvent02.java


import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;

public class MotorEvent02 {

    private static RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);

    public static void main(String[] args) {
        //Nehmen Sie eine Instanz der Klasse RotateStateEvent als Argument
        l_a.addListener(new RotateStateEvent());
        l_a.forward();
        Delay.msDelay(2000);
        l_a.stop();     
        Delay.msDelay(500);
    }
}

//Erstellen Sie eine Klasse, die die Schnittstelle RegulatedMotorListener implementiert
class RotateStateEvent implements RegulatedMotorListener{
    @Override
    public void rotationStarted(
                    final RegulatedMotor motor,
                    final int tachoCount,
                    final boolean stalled,
                    final long timeStamp) {
                //Definieren Sie den Prozess
                System.out.println("Started");
                Delay.msDelay(500);
            }

    @Override
    public void rotationStopped(
                    final RegulatedMotor motor,
                    final int tachoCount,
                    final boolean stalled,
                    final long timeStamp) {
                //Definieren Sie den Prozess
                System.out.println("Stopped");
                Delay.msDelay(500);
                }
}



Point : implements

Es kann als eine Klasse definiert werden, die die Schnittstelle in Form von class implementiert interface {} implementiert.


2. Beispielcode für die Schnittstelle TimerListnener und die Implementierungsklasse Timer

◯ Erstellen Sie Ihre eigene SecondCounter-Klasse für die Timer-Klasse. Die Timer-Klasse verwendet eine Instanz der TimerListener-Schnittstelle (die Klasse, die sie implementiert) als Argument. Rufen Sie dann ** die ** timedOut-Methode (= Verarbeitung) in der TimerListener-Schnittstelle (der Klasse, die sie implementiert) ** in jedem angegebenen Zyklus ** auf.

Dieses Mal zählt das Programm die Zählung alle 1 Sekunde, zeigt sie an und gibt alle 5 Sekunden einen Ton aus.

import lejos.utility.Timer;
import lejos.hardware.Sound;
import lejos.utility.TimerListener;

public class SecondCounter {
    private int second;

    //Generieren Sie alle 1000 Millisekunden einen Interrupt
    private Timer timer = new Timer(1000, new CountTimer());

    public void reset() {
        second = 0;
    }

    public int getSecond() {
        return second;
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
    }
    //Erstellen Sie eine CountTimer-Klasse, die die Schnittstelle TimerListener implementiert
    class CountTimer implements TimerListener {
        //TimedOut alle 1000 Millisekunden()Die Methode wird von Timer aufgerufen
        //Passen Sie den Verarbeitungsinhalt der Methoden in der Schnittstelle an und definieren Sie ihn
        @Override
        public void timedOut() {
            //Fügen Sie eins nach dem anderen hinzu
            second++;
            System.out.print(second);
            //Machen Sie alle 5 Sekunden einen Ton
            if(second % 5 == 0 ) {
            	Sound.beep();
            }
        }
    }
}
import lejos.hardware.Button;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.utility.Delay;

public class SecondCounterSample {
	
    private static RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);

    public static void main(String[] args) {
        
        ////Erstellen einer Instanz der oben definierten Klasse SecondCounter
        SecondCounter counter = new SecondCounter();
        //Beginnen Sie mit dem Zählen
        counter.start();

        //Wiederholen Sie die Verarbeitung 20 Mal
        for (int i = 0; i < 20; i++) {
        	
            if(i == 10) {
            	//Timer zurücksetzen
            	System.out.print("reset ");
            	counter.reset();
            }else if(i > 15) {
            	//Langsames Fahren
            	System.out.print("slowdown ");
            	l_a.setSpeed(100);
            }else {
            	//Beschleunigen
            	//Anzahl*Stellen Sie die Geschwindigkeit auf 100 ein
            	l_a.setSpeed(counter.getSecond() * 100);
            }
            l_a.forward();
            Delay.msDelay(1000);
        }
        l_a.stop();
        counter.stop(); 

        System.out.println("push any button");
        Button.waitForAnyPress();
    }

}

Point : public Timer(int theDelay,TimerListener el) Nimmt einen Zyklus und eine Instanz der TimerListener-Klasse (der Klasse, die sie implementiert) als Argumente.

Point : void timedOut() Called every time the Timer fires. Wird jedes Mal aufgerufen, wenn der Timer ausgelöst wird

3. Beziehung zwischen Motorklasse und Schnittstelle in leJOS

Betrachten wir die Beziehung zwischen Klassen und Schnittstellen in Bezug auf Motoren.

・ ** Klasse BaseRegulatedMotor ** ・ ** Großer geregelter Motor der Klasse EV3 ** ・ ** Schnittstellengeregelter Motor ** ・ ** Schnittstelle BaseMotor **

Die größte Sammlung von Motoren ist die Klasse BaseRegulatedMotor, die EV3LargeRegulatedMotor erbt. Die Schnittstelle RegulatedMotor ist in diesen beiden Klassen implementiert. Es erbt auch die Schnittstelle BaseMotor.


** Klasse BaseRegulatedMotor **

◯ Die folgende Schnittstelle ist implementiert BaseMotor,RegulatedMotor...

◯ Unterklasse EV3LargeRegulatedMotor, EV3MediumRegulatedMotor...

BaseRegulatedMotor.java


//Auszug aus der BaseRegulatedMotor-Klasse
public abstract class BaseRegulatedMotor extends Device implements RegulatedMotor{

    public void forward()
    {
        reg.newMove(speed, acceleration, +NO_LIMIT, true, false);
    }

    public void rotate(int angle, boolean immediateReturn)
    {
        rotateTo(Math.round(reg.getPosition()) + angle, immediateReturn);
    }

    public void addListener(RegulatedMotorListener listener)
    {
        reg.addListener(this, listener);
    }
    
    public RegulatedMotorListener removeListener() 
    {
        return reg.removeListener();
    }

    ...

}    

Punkt: ** Vererbung ** Sie können Erweiterungen verwenden, um Klassen zu erben.

[Referenzartikel] erweitert Schlüsselwort


Point : implements

Es kann als eine Klasse definiert werden, die die Schnittstelle in Form von class implementiert interface {} implementiert.


** Großer geregelter Motor der Klasse EV3 **

◯ Die folgende Schnittstelle ist implementiert Schnittstellen: BaseMotor, Encoder, RegulatedMotor, Tachometer

EV3LargeRegulatedMotor.java


//EV3LargeRegulatedMotor-Klasse, die von der BaseRegulatedMotor-Klasse erbt
public class EV3LargeRegulatedMotor extends BaseRegulatedMotor
{
    public EV3LargeRegulatedMotor(Port port)
    {
        super(port, null, EV3SensorConstants.TYPE_NEWTACHO, MOVE_P, MOVE_I, MOVE_D,
                HOLD_P, HOLD_I, HOLD_D, OFFSET, MAX_SPEED);
    }

    ...
}

** Schnittstellengeregelter Motor **

◯ In den folgenden Klassen implementiert BaseRegulatedMotor, EV3LargeRegulatedMotor, EV3MediumRegulatedMotor...

◯ Es erbt die Schnittstelle BaseMotor

//Auszug aus der Schnittstelle Regulated Motor
public interface RegulatedMotor extends BaseMotor, Tachometer, Closeable {

	public void addListener(RegulatedMotorListener listener);

    public RegulatedMotorListener removeListener();

    void rotate(int angle, boolean immediateReturn);

    public void stop(boolean immediateReturn);

    ...


** Schnittstelle BaseMotor **

◯ Schnittstelle Schnittstelle, die vom geregelten Motor geerbt wurde

BaseMotor.java


public interface BaseMotor {

	  void forward();

	  void backward();

	  void stop();
}

Schließlich

Danke fürs Lesen. Ich würde mich freuen, wenn Sie mich wissen lassen könnten, ob es Fehler oder Punkte gibt, die verbessert werden müssen.

Recommended Posts

[ev3 × Java] Schnittstelle, Implementierung und Vererbung (Ereignisverarbeitung)
Vererbung und Schnittstelle.
Java- und Swift-Vergleich (3) Klassenimplementierung / Klassenvererbung / Klassendesign
Zusammenfassung der erweiterten Vererbung, Schnittstelle -java
Vererbung der JAVA-Lernverlaufsschnittstelle
Erzielen Sie eine Mixin-ähnliche Implementierungsvererbung: Ruby-Modul, Java-Schnittstelle, PHP-Eigenschaft
[Java] Fehler beim Methodenaufruf, wenn Vererbung und Schnittstellenimplementierung gleichzeitig ausgeführt werden
[Java-Anfänger] Über Abstraktion und Schnittstelle
[JAVA] Unterschied zwischen Abstract und Interface
BloomFilter-Beschreibungs- und Implementierungsbeispiel (JAVA)
Java (Schnittstelle)
[Java] Vererbung
Java-Implementierung zum Erstellen und Lösen von Labyrinthen
Java-Vererbung
[Java] -Schnittstelle
Java-Vererbung
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
Java (Vererbung)
[Java] Inhalt der Collection-Schnittstelle und der List-Schnittstelle
Java Basic Learning Content 6 (Vererbung / Abstrakte Klasse / Schnittstelle)
PostgreSQL Pub / Sub-Funktion und Java-Client-Implementierung
Fragen in Java-Ausnahmebehandlung werfen und versuchen-fangen
Java-Ausnahmebehandlung?
Über die Java-Schnittstelle
[Java] Klassenvererbung
Schnittstelle und Zusammenfassung
[Java] -Schnittstelle
Java und JavaScript
XXE und Java
[Java] Ausnahmebehandlung
[Java] Funktionsschnittstelle
Über Java-Vererbung
Über Schnittstelle, Java-Schnittstelle
☾ Java / Ausnahmebehandlung
Informationen zur Behandlung von Java-Ausnahmen
Behandlung von Java-Ausnahmen
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
Verwendung von Abstract Class und Interface in Java richtig
[Java Silver] (Ausnahmebehandlung) Informationen zu den Anweisungen try-catch-finally und try-with-resource
[Java] Umgang mit Zeichenketten (String-Klasse und StringBuilder-Klasse)