2013-02-16 13 views
7

Ecco un esempio di quello che sto cercando di chiedereJava polimorfismo Come chiamare al metodo di classe eccellente per oggetto sottoclasse

superclasse Name.java

public class Name{ 
    protected String first; 
    protected String last; 

     public Name(String firstName, String lastName){ 
     this.first = firstName; 
     this.last = lastName; 
     } 

     public String initials(){ 
     String theInitials = 
      first.substring(0, 1) + ". " + 
      last.substring(0, 1) + "."; 
     return theInitials; 
     } 

e quindi la sottoclasse è ThreeNames.java

public class ThreeNames extends Name{ 
    private String middle; 

    public ThreeNames(String aFirst, String aMiddle, String aLast){ 
    super(aFirst, aLast); 
    this.middle = aMiddle; 
    } 

    public String initials(){ 
    String theInitials = 
     super.first.substring(0, 1) + ". " + 
     middle.substring(0, 1) + ". " + 
     super.last.substring(0, 1) + "."; 
    return theInitials; 
    } 

quindi se creo un oggetto Threename con ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith") e quindi chiamare System.out.println(example1.initials()); mi metterò B.S.S. ottengo questo.

La mia domanda è c'è un modo per chiamare il metodo iniziali che è nella classe nome in modo che la mia uscita è solo B.S.

+0

grazie fantastici per le risposte! –

+0

possibile duplicato di [Accesso alla funzione di super classe usando l'oggetto sottoclasse] (http://stackoverflow.com/questions/2432249/accessing-super-class-function-using-subclass-object) –

risposta

11

no. una volta sovrascritto un metodo, qualsiasi invocazione di quel metodo dall'esterno verrà instradata al metodo sottoposto a override (eccetto, naturalmente, se è stata nuovamente ignorata più in basso nella catena di ereditarietà). è possibile chiamare solo il metodo di super-da dentro il proprio metodo sovrascritto in questo modo:

public String someMethod() { 
    String superResult = super.someMethod(); 
    // go on from here 
} 

ma non questo è quello che stai cercando qui. si potrebbe forse trasformare il vostro metodo in:

public List<String> getNameAbbreviations() { 
    //return a list with a single element 
} 

e poi nella sottoclasse fare questo:

public List<String> getNameAbbreviations() { 
    List fromSuper = super.getNameAbbreviations(); 
    //add the 3 letter variant and return the list 
} 
+0

Questo ha senso come se un metodo potesse essere usato in sottoclassi, perché ignorare? Metti semplicemente quel blocco in un altro metodo e chiama quel metodo nel metodo genitore che sarà sovrascritto. –

5

Ci sono molti modi per farlo. Un modo: non eseguire l'override di Names#initials() in ThreeNames.

Un altro modo è aggiungere un metodo a ThreeNames che delega a Names#initials().

public class ThreeNames extends Name { 
    // snip... 

    public String basicInitials() { 
     return super.initials(); 
    } 
} 
1

vorrei invece lasciare le iniziali solo nella superclasse e introdurre un nuovo metodo che restituirà il completo iniziali. Quindi nel tuo codice vorrei semplicemente rinominare il metodo delle iniziali in ThreeNames con qualcos'altro. In questo modo il tuo metodo iniziale è lo stesso attraverso le implementazioni di Nome

Problemi correlati