web-dev-qa-db-fra.com

Java Polymorphisme Comment appeler à la méthode Super Class pour l'objet de sous-classe

Voici un exemple de ce que j'essaie de demander

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

et puis la sous-classe est Thenames.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;
  }

donc, si je crée un objet Thretiname avec ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith"), puis appelez System.out.println(example1.initials()); Je vais obtenir B.S.S. Je l'obtiens.

Ma question est qu'il y a un moyen d'appeler la méthode Initials qui se trouve dans la classe de nom de sorte que ma sortie soit juste B.S.

11
Kailua Bum

non. Une fois que vous avez remplacé une méthode, toute invocation de cette méthode de l'extérieur sera acheminée vers votre méthode remplacée (sauf bien sûr, si sa remplaçait de nouveau sur la chaîne d'héritage). vous ne pouvez appeler la méthode super à l'intérieur de votre propre méthode surchargée comme ceci:

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

mais ce n'est pas ce que vous recherchez ici. Vous pourriez peut-être transformer votre méthode en:

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

puis dans la sous-classe procédez comme suit:

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

Il y a beaucoup de façons de le faire. D'une manière: ne remplacez pas Names#initials() in ThreeNames.

Une autre façon est d'ajouter une méthode à ThreeNames qui délégués à Names#initials().

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

    public String basicInitials() {
        return super.initials();
    }
}
5
Matt Ball

Je voudrais plutôt laisser des initiales seules dans la superclasse et introduisez une nouvelle méthode qui retournera les initiales complètes. Donc, dans votre code, je renommerais simplement la méthode des initiales à Threenames à autre chose. De cette façon, votre méthode des initiales est la même sur les implémentations du nom

1
ZeusSelerim