Appel de methode

Résolu/Fermé
#thegoat Messages postés 3 Date d'inscription mercredi 23 mars 2016 Statut Membre Dernière intervention 24 mars 2016 - 23 mars 2016 à 18:19
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 - 24 mars 2016 à 11:53
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

greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
Modifié par greg6614 le 23/03/2016 à 20:47
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
#thegoat Messages postés 3 Date d'inscription mercredi 23 mars 2016 Statut Membre Dernière intervention 24 mars 2016
23 mars 2016 à 22:43
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
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 23/03/2016 à 22:55
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
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
24 mars 2016 à 11:53
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
#thegoat Messages postés 3 Date d'inscription mercredi 23 mars 2016 Statut Membre Dernière intervention 24 mars 2016
24 mars 2016 à 08:09
Un grand merci a vous aussi pour vos precisions totodunet !
0