2012-11-25 5 views
2

J'ai 4 classes. L'un est une classe de pilote, un et une interface et deux classes d'enfants. Ceci est la classe d'interface:La mise en œuvre ne fonctionne pas

public interface Speaker { 
    public void speak(); 
    public void announce(String announcement); 
} 

Ceci est la classe du pilote:

public abstract class SpeakerDriver implements Speaker { 
    public static void main (String [] args) { 
     Speaker ref; 
     Politician poli = new Politician("George Bush"); 
     Lecturer lect = new Lecturer("Professor Cross"); 
     Pastor past = new Pastor ("P.M. Smith"); 

     ref = poli; 
     ref = lect; 
     ref = past; 

     System.out.println(); 
     System.out.println(lect); 
     System.out.println(past); 
    } 
} 

et ce sont les deux classes d'enfants:

public class Pastor implements Speaker { 
    protected String announcement; 

    public Pastor (String name) {  
    } 

    @Override 
    public void speak() { 
    } 

    @Override 
    public void announce(String announc) { 
     System.out.println("I am the pastor at CCBC."); 
    } 
} 

public class Lecturer implements Speaker { 
    protected String announcement; 

    public Lecturer(String name) { 
    } 

    @Override 
    public void speak() { 
    } 

    @Override 
    public void announce(String announcement) {  
     System.out.println("I am the lecturer at CCBC");  
    } 
} 

Ma question est, quel est le problème avec mon implémentation qui fait ressembler la sortie:

 
[email protected] 
[email protected] 

Quand ils devraient contenir le texte qui est dans le println.

+0

C'est un peu bizarre de voir un paramètre passer à 'announce' et ensuite tomber sur le sol. Je comprends que c'est une exigence d'interface, mais cela devrait vous obliger à utiliser le paramètre d'une certaine manière ... De plus, c'est un peu bizarre que 'announce' ne retourne pas' String'. Dites juste. – Makoto

+0

Vous ne nommez pas le locuteur, car vous ne sauvegardez pas ses valeurs dans le constructeur. De cette façon, vous pouvez remplacer 'toString()'. – Mordechai

Répondre

2

Vous avez juste besoin d'implémenter une méthode toString() dans chacune des sous-classes.

public String toString() { 
    return this.name; 
} 

quelque chose comme ça. print() appelle cette méthode pour renvoyer une chaîne.

EDIT: ignore, n'a pas lu le bit de fin.

+0

Vous voulez dire 'this.name' ... – Mordechai

+0

En effet. Trop python récemment. Merci –

+0

Qu'est-ce que c'est exactement ce nom? Je l'ai changé pour renvoyer l'annonce après avoir ajouté des méthodes setter et getter. – brennaboo

5

Vous imprimez l'objet avec cette déclaration:

System.out.println(lect); 

Vous vouliez probablement dire d'appeler une fonction sur l'objet:

lect.announce(); 

Notez également que votre classe pilote ne pas vraiment besoin de mettre en œuvre l'interface «haut-parleur», et l'une des déclarations suivantes, les deux premiers ne réalisent effectivement rien:

ref = poli; 
ref = lect; 
ref = past; 
0

Pour résoudre ce problème, vous devez remplacer la méthode toString() dans chacune de vos classes, car cette sortie est l'adresse et le type de l'objet car Java ne sait pas comment le convertir en une chaîne sinon. Il semble que vous vouliez appeler {object} .announce() plutôt que d'essayer d'imprimer l'objet.

Questions connexes