2014-12-08 3 views
0

Мой вопрос не является специфичным для Java, но я думаю, что это больше похоже на вопрос о шаблонах шаблонов. Попробую объяснить на примере:Имея тот же метод с двумя разными типами поведения?

У меня есть два класса (А и В), B расширяет A. два класса выглядеть следующим образом:

public class A { 

    protected int method1() { 
     System.out.println(method3()); 
    } 

    protected int method3() { 
     return 3; 
    } 

} 

.

public class B extends A { 

    protected void method2() { 
     //Calling method1 
     method1(); // Output : 3 

     //Calling method1 another time but method3 needs to be slightly different 
     method1(); // Output needs to be : 6 
    } 
} 

Итак, я хотел бы назвать два раза один и тот же метод, но я хочу, чтобы изменить то, что находится внутри method3() при вызове его во второй раз. Очевидно, что я не хочу определять два разных метода1(), потому что метод1 не только распечатывает int, но и делает больше.

Второй method3 может выглядеть следующим образом:

protected int method3bis() { 
    return 2*3; 
} 

Я бы очень хотел, чтобы избежать прохождения какой-то аргумент через все методы, то, что будет выглядеть следующим образом:

protected int method1(int arg) { 
    if(arg == 0) 
     System.out.println(method3()); 

    if(arg == 1) 
     System.out.println(method3bis()); 
} 

Вы знаете хороший способ сделать это? Заранее спасибо :-)

+0

Похоже, вы хотите переопределить 'метод1' в классе B. –

+0

Вы можете добавить счетчик в метод1, который будет увеличиваться при использовании, а затем использовать этот счетчик во второй раз, когда он вызывается. – ryekayo

+0

@ Zéychin согласился. Вам все равно нужно написать новое поведение в переопределении. –

ответ

0

Невозможно изменить реализацию метода во время выполнения на Java.

Когда вы переопределить метод, можно назвать прямой суперкласса реализации, например:

class Super { 
    void method1() { 
     System.out.println(3); 
    } 
} 

class Sub { 
    @Override 
    void method1() { 
     System.out.println(2 * 3); 
    } 

    void method2() { 
     // printing 3 
     super.method1(); 

     // printing 6 
     this.method1(); 
    } 
} 

Однако, это не может быть использован так, как вы описали (вызов method1 при изменении реализация method3). И это также было бы очень дезорганизованным способом реализовать то, что вы описали.

Вы должны использовать параметры метода, потому что это то, для чего они предназначены.

0

Вы можете выполнить это с помощью отражения, создав новый объект A, но это не очень хороший способ. Вам лучше использовать блоки if/else.

import java.lang.reflect.*; 

public class B extends A { 

     protected void method2() { 

      try { 
       Class a = Class.forName("A"); 
       Object aa = a.newInstance(); 
       ((A) aa).method1(); // Output : 3 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 



      //Calling method1 another time but method3 needs to be slightly different 
      this.method1(); // Output needs to be : 6 
     } 

     @Override 
     protected int method3() { 
      return 2*3; 
     } 

} 
+0

В обоих случаях будет вызван метод3 из подкласса – manzur