Dans cet article, nous nous intéresserons principalement à la fonction appelée interface utilisant des robots.
L'interface est comme une classe qui définit ** les spécifications de méthode uniquement **. Les méthodes sont répertoriées dans l'interface, mais leur ** traitement ** n'est pas écrit.
Ainsi, lorsque vous regardez une méthode, vous savez ** ce qu'elle fait **, mais ** ce qu'elle fait réellement **. Vous pouvez voir ce que fait la méthode en regardant à l'intérieur de la classe ** qui implémente l'interface **.
Point: ** Interface ** Définir uniquement les spécifications de la méthode (valeur de retour, nom de la méthode, arguments) Ne traite pas réellement
Point: ** Classe qui implémente l'interface ** Définir le contenu de traitement de la méthode En fait, traiter
[Article de référence] Interface implémentée! Comment utiliser les outils en Java
Jetons d'abord un œil au code ci-dessous. C'est un programme qui affiche des caractères au début et à la fin de la rotation du moteur.
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{
//Génération d'instance
//RegulatedMotor:interface
//EV3LargeRegulatedMotor:Classe qui implémente l'interface
private static RegulatedMotor l_a = new EV3LargeRegulatedMotor(MotorPort.A);
public static void main(String[] args) {
//Génération d'instance
//Personnalisez les méthodes dans l'interface RegulatedMotorListener pour définir le processus
final RegulatedMotorListener listener = new RegulatedMotorListener() {
//Personnalisez les deux méthodes suivantes de l'interface RegulatedMotorListener
//Personnalisez la méthode appelée lorsque le moteur commence à tourner
@Override
public void rotationStarted(
final RegulatedMotor motor,
final int tachoCount,
final boolean stalled,
final long timeStamp) {
//Que personnaliser
System.out.println("Started");
Delay.msDelay(500);
}
//Personnalisez la méthode appelée lorsque le moteur cesse de tourner
@Override
public void rotationStopped(
final RegulatedMotor motor,
final int tachoCount,
final boolean stalled,
final long timeStamp) {
//Que personnaliser
System.out.println("Stopped");
Delay.msDelay(500);
}
};
//La méthode addListener prend une instance de RegulatedMotorListener comme argument
//S'il y a un mouvement dans le moteur, il sera notifié à l'auditeur
//Et la méthode dans l'auditeur est appelée
l_a.addListener(listener);
l_a.forward();
Delay.msDelay(2000);
l_a.stop();
Delay.msDelay(500);
}
}
Je souhaite utiliser la ** méthode addlistener ** pour afficher des caractères au début et à la fin de la rotation du moteur **. ※void addListener(RegulatedMotorListener listener) Ajouter un objet écouteur qui vous avertira lorsque la rotation démarre ou s'arrête
La méthode addlistener étant implémentée dans la classe EV3LargeRegulatedMotor, ** créez une variable de type référence l_a à partir de celle-ci et utilisez-la sous la forme l_a.addlistener **.
De plus, comme la méthode addlistener prend une instance de ** interface RegulatedMotorListener ** comme argument, il est nécessaire de créer d'abord une instance à partir de cette ** interface **.
Cependant, comme l'interface ** ne définit pas le traitement de la méthode **, même si une instance est créée, ** le traitement ne peut pas réellement être effectué **. Par conséquent, ** personnalisez la méthode dans l'interface pour définir le processus ** afin que le processus puisse être exécuté.
◯ Interface: ** Moteur régulé ** Classe d'implémentation: EV3 LargeRegulatedMotor
◯ Interface: ** RegulatedMotorListener ** Classe d'implémentation: Aucune (implémentée dans l'interface)
◯ Méthode: ** rotationStarted () ** Seules les spécifications sont définies dans RegulatedMotorListener Méthode appelée lorsque le moteur commence à tourner
◯ Méthode: ** rotationStopped () ** Seules les spécifications sont définies dans RegulatedMotorListener Méthode appelée en fin de rotation du moteur
◯ Méthode: ** addlistener () ** void addListener(RegulatedMotorListener listener) Il prend un objet ** généré à partir de l'interface ** comme argument. Les spécifications sont définies dans l'interface RegulatedMotor et implémentées dans la classe EV3LargeRegulatedMotor.
◯ Créez vous-même une classe appelée RotateStateEvent pour implémenter l'interface RegulatedMotorListener. Dans celui-ci, personnalisez la méthode dans RegulatedMotorListener pour définir le processus.
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) {
//Prenez une instance de la classe RotateStateEvent comme argument
l_a.addListener(new RotateStateEvent());
l_a.forward();
Delay.msDelay(2000);
l_a.stop();
Delay.msDelay(500);
}
}
//Créer une classe qui implémente l'interface RegulatedMotorListener
class RotateStateEvent implements RegulatedMotorListener{
@Override
public void rotationStarted(
final RegulatedMotor motor,
final int tachoCount,
final boolean stalled,
final long timeStamp) {
//Définir le processus
System.out.println("Started");
Delay.msDelay(500);
}
@Override
public void rotationStopped(
final RegulatedMotor motor,
final int tachoCount,
final boolean stalled,
final long timeStamp) {
//Définir le processus
System.out.println("Stopped");
Delay.msDelay(500);
}
}
Point : implements
Elle peut être définie comme une classe qui implémente l'interface sous la forme de `` class implements interface {} ''.
◯ Créez votre propre classe SecondCounter pour gérer la classe Timer. La classe Timer prend une instance de l'interface TimerListener (la classe qui l'implémente) comme argument. Ensuite, ** appelez la ** méthode timedOut (= traitement) dans l'interface TimerListener (la classe qui l'implémente) ** à chaque cycle spécifié **.
Cette fois, le programme compte le décompte toutes les 1 seconde, l'affiche et émet un son toutes les 5 secondes.
import lejos.utility.Timer;
import lejos.hardware.Sound;
import lejos.utility.TimerListener;
public class SecondCounter {
private int second;
//Générer une interruption toutes les 1000 millisecondes
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();
}
//Créer une classe CountTimer qui implémente l'interface TimerListener
class CountTimer implements TimerListener {
//TimedOut toutes les 1000 millisecondes()La méthode est appelée par Timer
//Personnaliser et définir le contenu de traitement des méthodes dans l'interface
@Override
public void timedOut() {
//Ajouter un par un
second++;
System.out.print(second);
//Faire un son toutes les 5 secondes
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) {
////Création d'une instance de la classe SecondCounter définie ci-dessus
SecondCounter counter = new SecondCounter();
//Commencer à compter
counter.start();
//Répéter le traitement 20 fois
for (int i = 0; i < 20; i++) {
if(i == 10) {
//Réinitialiser la minuterie
System.out.print("reset ");
counter.reset();
}else if(i > 15) {
//Conduite lente
System.out.print("slowdown ");
l_a.setSpeed(100);
}else {
//Accélérer
//compter*Réglez la vitesse sur 100
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) Prend un cycle et une instance de la classe TimerListener (la classe qui l'implémente) comme arguments.
Point : void timedOut() Called every time the Timer fires. Appelé chaque fois que la minuterie se déclenche
Regardons la relation entre les classes et les interfaces liées aux moteurs.
・ ** Classe BaseRegulatedMotor ** ・ ** Grand moteur régulé de classe EV3 ** ・ ** Moteur régulé par interface ** ・ ** Interface BaseMotor **
Le plus grand ensemble de moteurs est la classe BaseRegulatedMotor, dont EV3LargeRegulatedMotor hérite. L'interface RegulatedMotor est implémentée dans ces deux classes. Il hérite également de l'interface BaseMotor.
◯ L'interface suivante est implémentée BaseMotor,RegulatedMotor...
◯ Sous-classe EV3LargeRegulatedMotor, EV3MediumRegulatedMotor...
BaseRegulatedMotor.java
//Extrait de la classe BaseRegulatedMotor
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();
}
...
}
Point: ** Héritage ** Vous pouvez utiliser les extensions pour hériter des classes.
[Article de référence] extend keyword
Point : implements
Elle peut être définie comme une classe qui implémente l'interface sous la forme de `` class implements interface {} ''.
◯ L'interface suivante est implémentée Interfaces: BaseMotor, Encoder, RegulatedMotor, Tachometer
EV3LargeRegulatedMotor.java
//Classe EV3LargeRegulatedMotor qui hérite de la classe BaseRegulatedMotor
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);
}
...
}
◯ Implémenté dans les classes suivantes BaseRegulatedMotor, EV3LargeRegulatedMotor, EV3MediumRegulatedMotor...
◯ Il hérite de l'interface BaseMotor
//Extrait de l'interface Moteur régulé
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);
...
◯ Interface d'interface héritée du moteur régulé
BaseMotor.java
public interface BaseMotor {
void forward();
void backward();
void stop();
}
Merci pour la lecture. Je vous serais reconnaissant de bien vouloir me faire savoir s’il y a des erreurs ou des points à améliorer.
Recommended Posts