Как выбрать, какой метод вызывать при использовании полиморфизма? - PullRequest
0 голосов
/ 13 февраля 2019

Мне нужен способ выбрать, кто метод должен быть вызван.

Я вызываю родительский метод, который вызывает один из его методов, используя «this».Проблема в том, что я переопределяю этот метод в своем классе, поэтому при вызове родительского метода он вызывает мой метод вместо его метода.

public class MainTest    
{
    public static class A
    {
       public String m1()
       {
             return this.m2();
       }

       public String m2()
       {
           return "A.m2() called";
       }
    }

    public static class B extends A
    {
        @Override
        public String m1()
        {
          return "B.m1() called";
        }

        @Override
        public String m2()
        {
          return "B.m2() called";
        }

        public String m3()
        {
          return super.m1();
        }
    }

    public static void main(String[] args)
    {
        System.out.println(new B().m3());
    }
}

Я хочу достичь "A.m2 () call"но на самом деле вывод "B.m2 () называется"

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Чтобы добиться того, что вы хотите, вам нужно позвонить super.m2() в B.m3.

Вызов super.m1() не будет работать, потому что A.m1 вызывает this.m2().this имеет тип времени выполнения B (вы никогда не создавали объект A, поэтому он не может быть типа времени выполнения A), поэтому будет вызван m2 в B.Вы можете позвонить только по номеру super.m2(), чтобы достичь желаемого.

0 голосов
/ 13 февраля 2019

Поскольку вы переопределили m2() в B, то единственный способ заставить A.m2() работать вместо B.m2() - это вызвать super.m2() внутри B.m2().

Даже если вы звоните super.m1(); в B.m3(), вызов this.m2() в A.m1() все равно приведет к запуску переопределенного B.m2().

Если вы не хотитечтобы иметь super.m2() внутри B.m2() (или не хотеть этого во всех случаях), тогда единственная альтернатива - создать другой метод, который вы не переопределите в B (и вызвать его из A.m1() -возможно, вам придется изменить или создать еще одну A.m1()):

public static class A {
   public String m1(){ //you may need a different method to call from B.m3()
       return this.anotherM2();
   }
   public String m2(){
       return "A.m2() called";
   }
   public String anotherM2() {
       return "A.m2() called";
   }
}
0 голосов
/ 13 февраля 2019

вы можете увидеть следующий процесс:

-B.m3 делает super.m1, что означает, что A.m1

-A.m1 делает this.m2, где это B, дляэту причину B.m2 называют

...