Appel de methode

Résolu
#thegoat Messages postés 4 Statut Membre -  
greg6614 Messages postés 629 Statut Membre -
Bonjour, j'ai une class Document que voici :

public class Document {
private int numero;
private String titre;
//Constructers
public Document(int numero, String titre) {
this.numero=numero;
this.titre=titre;
} //gets

public int getNumero() {
return numero;
}

public String getTitre() {
return titre;
}
//Expliquer le code de cette méthode

public boolean equals(Object obj) {
return obj instanceof Document && ((Document) obj).numero == numero;
}

public String toString() {
return titre + " Numéro : " + numero;
}
}


A partir de celle ci je me suis servi de l'heritage pour creer une class Livre que voici:


public class Livre extends Document{
private String auteur;
private int nombrePages;

public Livre(int numero, String titre, String auteur, int nombrePages){
super(numero,titre);
this.auteur=auteur;
this.nombrePages=nombrePages;
}

public String getAuteur(){
return auteur;<code>

}

public int getNombrePages(){
return nombrePages;
}

public String toString(){
return super.toString()+" Auteur: "+auteur+" Nombre de pages: "+nombrePages;
}

}
</code>

Ce faisant, je crée une class Bibliotheque qui va me permettre de simuler l'ajout ou suppression de documents dans celle ci. Le probleme est que j'ai une methode afficherAuteur qui est censéé afficher les auteurs de tous les documents tant que ces documents sont de type Livre, car ce sont les seuls a avoir l'attribut auteur (j'ai créé d'autre class Revue..), or je n'arrive pas a faire appel a la methode getAuteur de la class Livre.

Ainsi:


public class Bibliotheque {
//Attributs
private Vector<Document> documents;
//Constructeurs
public Bibliotheque(){
documents= new Vector<Document>();
}
//Affichage de tous les documents de la bibliothèque
public void afficherDocuments(){
for(int i=0;i<documents.size();i++){
System.out.println(documents.get(i).toString());
}
}
//Afficher tous les auteurs de la bibliothèque. //Attention, seuls les documents de type Livre et Roman possèdent des auteurs
public void afficherAuteurs(){
for(int i=0;i<documents.size();i++){
if(documents.get(i) instanceof Livre) System.out.println((Livre) documents.get(i).getAuteur());
}
}
//fin afficherAuteurs //Supprimer un document de la collection de documents
public boolean supprimer(Document doc){
return(documents.remove(doc));
}
//Ajouter un document
public boolean ajouter(Document doc){
return(documents.add(doc));
}
//Obtenir le document à l'indice i
public Document getUnDocument(int i){
return (documents.get(i));
}

}


Merci d'avance pour votre aide

3 réponses

  1. greg6614 Messages postés 629 Statut Membre 107
     
    Hello, alors concernant ton problème c'est normal, car tu appel ta méthode
    getAuteur()
    sur un objet de type
    Document
    malgré ton cast.

    Tu dois écrire
    ((Livre)d).getAuteur()
    et là tu appel la méthode sur un objet de type Livre.

    Ensuite pense aux boucles simplifiées java qui s'écrivent :
    for (Document d : documents){
         System.out.println(d)
    }


    Et qui se lisent "Pour tout éléments d de type Document contenu dans documents ...".

    Au passage il est inutile de faire un
    System.out.println(d.toString());
    car
    toString()
    est appelé automatiquement. JAVA appel la première méthode
    toString()
    qu'il trouve en remontant l'abre d'héritage.

    Je t'ai donc fais quelques petites modifications sur ton code que voici :

    public class Document {
     private int numero;  
     private String titre;      
     //Constructers   
     public Document(int numero, String titre) {  
      this.numero=numero;
      this.titre=titre;
     }       //gets  
    
     public int getNumero() {      
      return numero;
     }   
    
     public String getTitre() {   
      return titre;
     }
     //Expliquer le code de cette méthode  
    
     public boolean equals(Object obj) {   
      return obj instanceof Document && ((Document) obj).numero == numero;  
     }  
    
     public String toString() {     
      return titre + " Numéro :  " + numero; 
     }
    }


    public class Livre extends Document{
     private String auteur;
     private int nombrePages;
    
     public Livre(int numero, String titre, String auteur, int nombrePages){
      super(numero,titre);
      this.auteur=auteur;
      this.nombrePages=nombrePages;
     }
    
     public String getAuteur(){
      return auteur;
    
     } 
    
     public int getNombrePages(){ 
      return nombrePages; 
     } 
    
     public String toString(){ 
      return super.toString()+" Auteur: "+auteur+" Nombre de pages: "+nombrePages; 
     } 
    
    } 


    import java.util.Vector;
    
    public class Bibliotheque {
     //Attributs  
     private Vector<Document> documents;
     //Constructeurs  
     public Bibliotheque(){  
      documents= new Vector<Document>();
     }   
     //Affichage de tous les documents de la bibliothèque  
     public void afficherDocuments(){ 
      for(Document d : documents){
       System.out.println(d);
      }
     }  
     //Afficher tous les auteurs de la bibliothèque.  //Attention, seuls les documents de type Livre et Roman possèdent des auteurs  
     public void afficherAuteurs(){  
      for(Document d : documents){
       if(d instanceof Livre){
        System.out.println(((Livre) d).getAuteur()); 
       }
      }
     }
     //fin afficherAuteurs    //Supprimer un document de la collection de documents  
     public boolean supprimer(Document doc){  
      return(documents.remove(doc));
     }    
     //Ajouter un document
     public boolean ajouter(Document doc){  
      return(documents.add(doc));
     }
     //Obtenir le document à l'indice i  
     public Document getUnDocument(int i){ 
      return (documents.get(i));
     }
    }


    En espérant t'avoir aidé
    Greg
    0
  2. #thegoat Messages postés 4 Statut Membre
     
    Merci beaucoup pour votre aide Greg, cela m'a a été très utile! Donc si je comprends bien en java les boucles s'utilisent plutôt de la forme (for d : type) au lieu d’incrémenter un compteur initialisée comme dans tout autre(enfin je crois) langages...
    0
    1. totodunet Messages postés 1513 Statut Membre 201
       
      si la classe implémente l'interface Iterable tu peux faire directement une boucle for(Type objet:collection)

      Là la collection Vector implémente cette interface ( https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html )

      c'est pas automatique sur toutes les classes même si pratiquement toutes les classes types Collection de Java l'implémente. Pour un tableau classique, il faut mettre en place un compteur.
      0
    2. greg6614 Messages postés 629 Statut Membre 107
       
      Voilà comme a-dit toto si la classe implémente l'interface Iterable et que tu n'a pas nécessitè d'utiliser les indices tu peux utiliser cette forme sinon la forme classique sera obligatoire.

      Avec plaisir pour l'aide.
      0
  3. #thegoat Messages postés 4 Statut Membre
     
    Un grand merci a vous aussi pour vos precisions totodunet !
    0