web-dev-qa-db-ja.com

Javaポリモーフィズムサブクラスオブジェクトのスーパークラスメソッドを呼び出す方法

これが私が尋ねようとしていることの例です

スーパークラス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;
      } 
_

そして、サブクラスは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;
  }
_

ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith")でThreenameオブジェクトを作成してからSystem.out.println(example1.initials());を呼び出すと、_B.S.S._が返されます。

私の質問は、出力が_B.S._になるように、Nameクラスにあるinitialsメソッドを呼び出す方法があることです

11
Kailua Bum

番号。メソッドをオーバーライドすると、外部からのそのメソッドの呼び出しは、オーバーライドされたメソッドにルーティングされます(もちろん、継承チェーンのさらに下でオーバーライドされた場合を除きます)。次のように、オーバーライドされた独自のメソッド内からのみスーパーメソッドを呼び出すことができます。

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

しかし、それはあなたがここで探しているものではありません。あなたはおそらくあなたの方法を次のように変えることができます:

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

そして、サブクラスでこれを行います:

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

それを行うには多くの方法があります。 1つの方法:ThreeNamesNames#initials()をオーバーライドしないでください。

もう1つの方法は、Names#initials()にデリゲートするメソッドをThreeNamesに追加することです。

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

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

代わりに、スーパークラスでイニシャルをそのままにして、完全なイニシャルを返す新しいメソッドを導入します。したがって、コードでは、ThreeNamesのinitialsメソッドの名前を別の名前に変更するだけです。このように、イニシャルメソッドはNameの実装全体で同じです

1
ZeusSelerim