In diesem Artikel werden wir uns hauptsächlich mit der Funktion Schnittstelle mit Robotern befassen.
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
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);
}
}
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
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 **.
Da die Methode addlistener eine Instanz der ** Schnittstelle RegulatedMotorListener ** als Argument verwendet, muss zunächst eine Instanz aus dieser ** Schnittstelle ** erstellt werden.
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.
◯ 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.
◯ 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.
◯ 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
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.
◯ 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.
◯ 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);
}
...
}
◯ 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 Schnittstelle, die vom geregelten Motor geerbt wurde
BaseMotor.java
public interface BaseMotor {
void forward();
void backward();
void stop();
}
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