[ev3 × Java] Interface, implémentation et héritage (traitement événementiel)

Dans cet article, nous nous intéresserons principalement à la fonction appelée interface utilisant des robots.

table des matières

  1. Qu'est-ce qu'une interface?
  2. Structure du code 1-0. Exemple de code pour implémenter le traitement dans l'interface 1-1. Exemple de code pour créer une classe et implémenter une interface
  3. Exemple de code pour l'interface TimerListnener et la classe d'implémentation Timer
  4. Relation entre la classe de moteur et l'interface dans leJOS

0. Qu'est-ce qu'une interface?

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


1. Structure du code

1-0. Exemple de code pour implémenter le traitement dans l'interface

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);
		
	}
}

Aperçu de l'exemple de code

  1. 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

  2. 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 **.

  3. 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 **.

  4. 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é.


Organiser un exemple de code

◯ 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.


1-0. Exemple de code pour créer une classe et implémenter une interface

◯ 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 {} ''.


2. Exemple de code pour l'interface TimerListnener et la classe d'implémentation Timer

◯ 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

3. Relation entre la classe de moteur et l'interface dans leJOS

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.


** Classe BaseRegulatedMotor **

◯ 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 {} ''.


** Grand moteur régulé de classe EV3 **

◯ 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);
    }

    ...
}

** Moteur régulé par interface **

◯ 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 BaseMotor **

◯ Interface d'interface héritée du moteur régulé

BaseMotor.java


public interface BaseMotor {

	  void forward();

	  void backward();

	  void stop();
}

finalement

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

[ev3 × Java] Interface, implémentation et héritage (traitement événementiel)
Héritage et interface.
Comparaison Java et Swift (3) Implémentation de classe / héritage de classe / conception de classe
Résumé d'héritage avancé, interface -java
Héritage de l'interface de l'historique d'apprentissage JAVA
Atteindre l'héritage d'implémentation de type Mixin: module Ruby, interface Java, trait PHP
[Java] Erreur d'appel de méthode lorsque l'héritage et l'implémentation de l'interface sont effectués en même temps
[Java débutant] À propos de l'abstraction et de l'interface
[JAVA] Différence entre abstrait et interface
Exemple de description et d'implémentation de BloomFilter (JAVA)
java (interface)
[Java] Héritage
Implémentation Java pour créer et résoudre des labyrinthes
Héritage Java
interface [java]
Héritage Java
[Java / Swift] Comparaison de l'interface Java et du protocole Swift
java (héritage)
[Java] Contenu de l'interface de collection et de l'interface de liste
Contenu d'apprentissage de base Java 6 (héritage / classe abstraite / interface)
Fonctionnalité PostgreSQL Pub / Sub et implémentation du client Java
Questions sur la gestion des exceptions Java throw et try-catch
Gestion des exceptions Java?
À propos de l'interface Java
[Java] Héritage de classe
interface et résumé
Interface [Java]
Java et JavaScript
XXE et Java
[Java] Gestion des exceptions
[Java] Interface fonctionnelle
À propos de l'héritage Java
À propos de l'interface, interface java
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
Utilisation correcte de la classe abstraite et de l'interface en Java
[Java Silver] (Gestion des exceptions) À propos des instructions try-catch-finally et try-with-resource
[Java] Gestion des chaînes de caractères (classe String et classe StringBuilder)