Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation d'interface

Sujet résolu
    3 juillet 2020 à 14:58:46

    Bonjour, je ne sais pas trop comment rechercher pour ce problème précis alors si quelqu'un y a déjà répondu je suis désolée de ne pas avoir vue ce post.

    Depuis un moment déjà j'essaye de faire deux choses :
    1) Savoir à quoi sert une interface de manière concrète.
    2) Créer une class/interface Button applicable seulement à mes abstract class Entity.

    1. C'est assez simple, je n'arrive pas à mettre dans mes programmes des interfaces, si je résume bien, une interface sert à rappeler au développeur qu'il faut implémenter tel ou tel method. Mais les method par default me semble inutile car on ne peux pas utiliser la moindre variable.

    2. (J'utilise processing pour l'aspect visuel) J'ai essayé de créer une abstract class Entity :

    public abstract class Entity {
    	private int posX;
    	private int posY;
    	private int width;
    	private int height;
    	private PApplet p;
    
    	public Entity(int posX, int posY, int width, int height, PApplet p) {
    	//code
    	}
    
    	//method
    }

    Et je voudrais que toutes mes Entity puissent recevoir une interface qui les transforme en Button

    //ExempleClass extends Entity
    ExempleClass exemple = new ExempleClass() implements Button

    Mais comme j'ai besoin que mes Button aient des variables je suis bloquée
    Je n'arrive pas à mettre de variable dans mes interfaces.
    Je n'arrive pas à récupérer des variables dans mes interfaces.
    Je n'arrive pas à limiter l'utilisation d'interface à certaine class.

    Quelqu'un aurait une idée siouplait?

    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2020 à 15:31:13

      LuneCaron a écrit:


      Depuis un moment déjà j'essaye de faire deux choses :
      1) Savoir à quoi sert une interface de manière concrète.
      2) Créer une class/interface Button applicable seulement à mes abstract class Entity.

      1. Une interface java définit un type pour les _variables_ (pas des objets). Les variables peuvent alors faire références à des  objets qui sont des instances de classes qui  implémentent l'interface.

      En particulier, ça sera à avoir du **polymorphisme**, c'est à dire qu'une variable puisse faire référence à des objets de différents types.  On pourra appliquer à cette variable les méthodes qui sont citées dans l'interface, puisqu'elles leur sont communes.

      2. "interface applicable à une classe", no comprendo.

      3. Si on veut limiter ceci à cela, en java, ça se fait en général par la notion d'accessibilité dans les packages.

      -
      Edité par michelbillaud 3 juillet 2020 à 15:42:05

      • Partager sur Facebook
      • Partager sur Twitter
        3 juillet 2020 à 16:30:22

        LuneCaron a écrit:

        Et je voudrais que toutes mes Entity puissent recevoir une interface qui les transforme en Button

        //ExempleClass extends Entity
        ExempleClass exemple = new ExempleClass() implements Button

        Hello,

        Quand je vois ça, je me demande, C'est quoi l'interface Button ? Un truc que tu as fait toi-même ? Est-ce que seulement cette interface existe ? Si oui, montre la nous stp ? Si non, elle va pas s'inventer toute seule.

        De plus, quand on peut dire qu'une classe implémente une interface, cela se fait dans la définition de la classe, pas lors de son instanciation.

        Si tu veux que ExempleClass implémente Button, tu as 2 options la :

        //Cas 1
        public class ExempleClass extends Entity implements Button {}
        
        //Ou Cas 2
        public abstract Entity implements Button{}
        //et
        public class ExempleClass extends Entity{}


        Et pour ta phrase "Et je voudrais que toutes mes Entity puissent recevoir une interface qui les transforme en Button", c'est très chelou comme phrase.

        On définit une classe comme étant une implémentation d'un interface, à aucun moment on transforme une instance de classe en une interface ou je sais pas quoi.

        -
        Edité par Tiffado 3 juillet 2020 à 16:32:19

        • Partager sur Facebook
        • Partager sur Twitter
          3 juillet 2020 à 17:21:08

          L'interface Button est habituellement une class que je créer encore et encore en déclinant pour chaque élément sur les quel je la place : image, polygone, texte, etc...
          Et à force de devoir réécrire le même code encore et encore j'en suis venue à la conclusion qu'il y avait un truc que je faisait mal.
          Et actuellement elle n'existe pas car justement je n'arrive pas à trouver comment la structurer.

          Mon objectif :
          public abstract class Entity {
              int posX, posY, width, height;
          
              public Entity(int posX, int posY, int width, int height) {
              //assignement aux variables
              }
          
              //getter, setter, et autre method par default ou non
          }
          public interface Button extends Entity { //Je sais qu'il y a énormément d'erreur de compilation mais c'est ce que j'aimerai pouvoir faire
              private boolean canClick = false;
              private boolean isClick = false;
          
              public default void interact() {
                  if(/*test utilisant posX, posY, width et height de Entity*/) {
                      isClick = true;
                  }
              }
          
              public void process();
          
              //autre method, getter, setter
          }
          public class Image extends Entity {
              private PImage img; //class de processing contenant juste une image
          
              public Image(int posX, int posY, int width, int height, PImage img) {
                  super(posX, posY, width, height);
                  this.img = img;
              }
          
              public void affiche() {
                  //affiche l'image dans les position/proportion
              }
          }
          public static void main(String[] args) {
              Image imageSimple = new Image(10, 10, 10, 10, /*monImage*/);
              Image imageClickable = new Image(10, 30, 10, 10, /*monImage*/) implements Button;
          }
          Ma première image serait donc une image simple, mais sur la deuxième on pourrait clicker dessus et par la suite accéder à isClick pour vérifier.
          J'ai compris que ce n'est pas possible mais je ne vois pas comment je peut faire pour faire ça de manière propre et surtout réutilisable.
          Car créer une class ImageButton j'ai déjà fait mais après je vais peux être devoir ajouter ImageToggleButton puis ImageTextField.
          Et après Rect puis RectButton, etc... Ce n'est pas propre ni maintenable...

          Alors je suppose que je fais quelque chose de travers quand ma méthode de réfléction mais je ne vois pas quoi.
          • Partager sur Facebook
          • Partager sur Twitter
            3 juillet 2020 à 23:28:07

            Quand ça commence par l'interface machin est une classe truc, on ne peut rien comprendre.

            Une interface n'est pas une classe.  Et il n'y a aucune raison valable de vouloir que ça en soit une.

            Donc, laisse tomber l'idée que tu veux faire ça, et reviens en arrière dans ta réflexion

            -
            Edité par michelbillaud 9 juillet 2020 à 11:25:34

            • Partager sur Facebook
            • Partager sur Twitter
              9 juillet 2020 à 10:46:21

              Une interface, ca n'étend pas une classe. C'est une classe qui implémente une interface.
              • Partager sur Facebook
              • Partager sur Twitter
                10 juillet 2020 à 13:18:28

                Merci, je sais.

                Ce n'est pas grave, je vais essayer de trouver une solution seule.
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juillet 2020 à 15:39:07

                  Pour éviter la réécriture, t'as 2 solutions: l'héritage ou la composition.

                  Les interfaces servent au typage, c'est une problématique différente et il faut considérer les 2 problèmes indépendamment.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juillet 2020 à 14:59:06

                    LuneCaron a écrit:

                    Merci, je sais.

                    Ce n'est pas grave, je vais essayer de trouver une solution seule.


                    Tu dis savoir, et pourtant tu écris ca :

                    public interface Button extends Entity

                    Ce qui est exactement l'inverse. Tu fais une interface en la faisant hériter d'une classe, et ca ne se fait pas. C'est pour ca que tu as des erreurs de compilations.

                    Donc globalement, on peut juste te dire que ta façon de procéder ne fonctionnera pas.

                    Pour te dire quoi faire dans ta situation, c'est pas si évident. Pour moi, Button devrait plus être une classe abstraite qu'une interface.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juillet 2020 à 15:07:00

                      Pourquoi la classe Button serait-elle abstraite ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juillet 2020 à 16:21:41

                        S'il veut garder son concept d'avoir une classe Entity tout en haut, et faire des boutons qui héritent/implémentent une classe/interface Button, il faut passer par une classe Button qui hériterait de Entity.

                        De ce que je comprends de ce qu'il veut faire, il/elle veut pas instancier Button, mais faire des classes qui en héritent, donc il peut la mettre abstraite (pas forcément utile de la mettre abstraite, mais au moins ça forcera à ne pas l'instancier directement)

                        Après, j'avoue qu’abstraite ou pas, ça dépend de son besoin, et je suis pas certain d'avoir tout compris...

                        Ca c'est en voulant garder son principe d'Entity etc.

                        En s'y penchant un peu plus, peut être qu'il faudrait tout changer.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 juillet 2020 à 16:32:32

                          Le problème de fond c'est de dire "un bouton c'est ceci" etc.

                          La question, c'est de savoir CE QU'ON VA FAIRE AVEC le bouton/l'entité/le machin/le truc. Quelles méthodes/fonctions on va leur appliquer, et ce que ça va faire.

                          Parce que là, exprimé en terme de "une class/interface B applicable seulement à une classe abstraite A", on est pas sorti de l'auberge.

                          -
                          Edité par michelbillaud 13 juillet 2020 à 16:34:42

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Utilisation d'interface

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown