2013-02-16 5 views
7

Hier zu Super-Klasse-Methode aufrufen, ist ein Beispiel dafür, was ichJava Polymorphismus Wie für Unterklasse Objekt

Super 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; 
     } 

und dann ist die Unterklasse ThreeNames.java

zu fragen versuche
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; 
    } 

so, wenn ich ein Threename Objekt mit ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith") erstellen und dann System.out.println(example1.initials()); rufen ich werde B.S.S. bekommen ich das.

Meine Frage ist, gibt es einen Weg, um die Initialen Methode aufzurufen, die im Namen der Klasse ist, so dass meine Ausgabe gerade ist B.S.

+0

super danke für die Antworten! –

+0

mögliches Duplikat von [Zugriff auf die Superklassenfunktion mit dem Unterklassenobjekt] (http://stackoverflow.com/questions/2432249/accessing-super-class-function-using-subclass-object) –

Antwort

11

Nr. Sobald Sie eine Methode außer Kraft gesetzt haben, wird jeder Aufruf dieser Methode von außen an Ihre überschriebene Methode weitergeleitet (außer natürlich, wenn sie erneut in der Vererbungskette überschrieben wird). Sie können nur die Super-Methode aufrufen, aus der eigenen überschriebene Methode wie folgt:

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

aber das ist nicht, was du hier suchen. Sie könnten vielleicht schalten Sie Ihre Methode in:

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

und dann in der Unterklasse dies tun:

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

Dies macht Sinn, als ob eine Methode sein könnte in Unterklassen verwendet, warum sie überschreiben? Setzen Sie diesen Block einfach in eine andere Methode und rufen Sie diese Methode in der übergeordneten Methode auf, die überschrieben werden soll. –

5

Es gibt viele Möglichkeiten, es zu tun. Eine Möglichkeit: überschreiben Sie nicht Names#initials() in ThreeNames.

Eine andere Möglichkeit besteht darin, eine Methode zu ThreeNames hinzuzufügen, die an Names#initials() delegiert.

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

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

ich stattdessen Initialen allein in der übergeordneten Klasse verlassen und ein neues Verfahren einführen, die die komplette zurückkehren Initialen. In deinem Code würde ich einfach die Initialen-Methode in ThreeNames in etwas anderes umbenennen. Auf diese Weise ist Ihre Initialen Methode die gleiche über die Implementierungen von Name