IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Problème d'accès méthodes classes/interface


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut Problème d'accès méthodes classes/interface
    Bonjour,

    je suis entrain d'essayer d'implémenter un monopoly, seulement j'ai un petit soucis.
    Je vous explique brièvement mon architecture :
    - Interface Case
    - Diverses classes qui implémentent Case
    - classe Plateau, qui contient un ArrayList de Case

    J'ai numéroté toutes mes cases. Mais je souhaiterais faire un toString du contenu de Plateau, dans l'ordre de la numérotation. Dans l'interface Case il y a une méthode getNumeroCase(). Seulement, apparemment je n'y ai pas accès dans la classe Plateau, et je ne peux donc pas trier mes différentes cases du plateau.

    Sauriez-vous d'où vient le problème ?

    Merci, et bonne soirée !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux nous montrer le code ?

    Normalement, de ce que tu décris, on imagine que dans plateau tu as un attribut listeDeCases :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Plateau {
     
        private List<Case> list = new ArrayList<>();
     
     
     
    }
    Dans ce cadre, il n'y a aucun souci pour accèder aux méthodes de l'interface Case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Plateau {
     
        private List<Case> list = new ArrayList<>();
     
        public String toString() {
     
               // affiche les cases dans l'ordre des numéro de case, séparées par des virgules
               return list.stream().sorted(Comparator.comparing(Case::getNumeroCase)).map(Case::toString).collect(Collectors.joining(", "));
     
     
        }
     
        // exemple qui retourne le numéro de case de la case à l'index spécifié en argument
        public int getPosition(int caseIndex) {
               return list.get(caseIndex).getNumeroCase();
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Bonjour,

    Oui, bien sûr, le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public interface Case {
    	String getNom();
    	String getType();
    	int getNumeroCase();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    package plateau;
    import cases.*;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
     
    public class Plateau {
    	private String nom;
    	private ArrayList<Case> lesCases = new ArrayList<Case>();
     
    	public Plateau(String nom) {
    		super();
    		this.nom = nom;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public int size() {
    		return lesCases.size();
    	}
     
    	public Case get(int index) {
    		return lesCases.get(index);
    	}
     
    	/*public void trier(ArrayList<Case> lesCases){
    		int i, j, temp;
    		for(i=0; i<lesCases.size()-1;i++){
    			for(j=i+1;j<lesCases.size();j++)
    			{
    				if(lesCases.getNumeroCase(i)>lesCases.get(j))
    				{
    					temp=lesCases.get(i);
    					lesCases.get(i)=lesCases.get(j);
    					lesCases.get(j)=temp;
    				}
    			}
    		}
    	}*/ // C'est donc cette partie qui ne fonctionne pas. J'avais pensé à faire un tri avec 2 boucles.
     
     
     
    	public boolean add(Case e) {
    		return lesCases.add(e);
    	}
     
    	@Override
    	public String toString() {
    		return "Plateau [nom = " + nom + ", \n lesCases = " + lesCases + "";
    	}
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ton souci est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lesCases.getNumeroCase(i)
    lesCases est du type List<Case>, pas Case. La méthode getNumeroCase() n'existe pas dans la classe List. C'est lesCases.get(i).getNumeroCase();.

    En revanche, à moins qu'il ne s'agisse d'un exercice où tu dois implémenter toi-même un algorithme de tri, ne t'embêtes pas à chercher à implémenter un tri.
    Pour trier la liste par numéro de case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort( list, Comparator.comparing(Case::getNumeroCase) );
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Je ne comprends pas trop.
    Il faut que je crée une nouvelle méthode où je rentre cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Collections.sort( lesCases, Comparator.comparing(Case::getNumeroCase) );
    Non, je ne dois pas forcement écrire un algorithme de tri, c'était juste plus logique pour moi...

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    là tu as fait une méthode pour trier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void trier(ArrayList<Case> lesCases){
    		int i, j, temp;
    		for(i=0; i<lesCases.size()-1;i++){
    			for(j=i+1;j<lesCases.size();j++)
    			{
    				if(lesCases.getNumeroCase(i)>lesCases.get(j))
    				{
    					temp=lesCases.get(i);
    					lesCases.get(i)=lesCases.get(j);
    					lesCases.get(j)=temp;
    				}
    			}
    		}
    	}*/ // C'est donc cette partie qui ne fonctionne pas. J'avais pensé à faire un tri avec 2 boucles.
    Et bien au lieu d'essayer d'écrire ton algorithme, et bien, tu fais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void trier(ArrayList<Case> lesCases){
     
            Collections.sort( lesCases, Comparator.comparing(Case::getNumeroCase) );
     
    }
    Tout simplement.

    Sinon, je ne vois pas trop de quoi tu parles quand tu dis que c'est plus logique Si le but est de manipuler les listes, tout ça, ou de travailler un algorithme de tri, ok. Si c'est juste pour réinventer la roue pour le plaisir, alors c'est une perte de temps, et des risques de bugs, inutles.

    if(lesCases.getNumeroCase(i)>lesCases.get(j))je n'avais pas même pas regarder l'expression à droite du > : lesCases.get(j) est du type Case ! Tu ne peux pas :
    • comparer des instances de Case par <
    • encore moins comparer un Case avec un int
    • sans parler de ce que j'ai déjà dit sur le fait que la classe de lesCases n'a pas de méthode getNumeroCase(int)


    Pour comparer les numéro des cases il faut écrire if(lesCases.get(i).getNumeroCase()>lesCases.get(j).getNumeroCase()).

    Au passage, c'est toujours mieux de toujours utiliser la classe ou l'interface la plus général, parce que ça ouvre plus ton code aux évolutions.

    quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void methode(ArrayList<Case> cases)
    tu écris une méthode qui ne s'appliquent qu'aux ArrayList.

    quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void methode(List<Case> cases)
    tu écris une méthode qui s'appliquent à toutes les List, aux ArrayList, mais aussi aux LinkedList ou autre... Si tu modifies l'implémentation concrête un jour, pas besoin de tout modifier partout.

    A moins d'avoir besoin d'appeler des méthodes spécifiques à la classe concrête, il vaut mieux typer par l'interface, et encore. On pourait très bien écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static void remplir(List<Machin> list, int n) {
    	       for(int i=0; i<n; i++) {
     
    	           list.add(new Machin(/*... c juste pour l'exemple ...*/));  
     
    	       } 
    	       if ( list instanceof ArrayList<?>) {
    	   			((ArrayList<?>)list).trimToSize(); // Traitement spécifique avec une méthode spécifique de ArrayList
    	       }
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Problème d'accès à la classe ZipFile
    Par gilles99 dans le forum Framework .NET
    Réponses: 5
    Dernier message: 25/04/2014, 15h17
  2. Problème accès méthode d'une autre classe
    Par java2411 dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 02/04/2013, 21h40
  3. Problème d'accés et classe interne.
    Par Pragmateek dans le forum C++
    Réponses: 8
    Dernier message: 14/08/2006, 13h34
  4. Problème d'accès aux méthodes d'une classe
    Par RR instinct dans le forum Langage
    Réponses: 5
    Dernier message: 26/06/2006, 14h51
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo