2014-12-08 2 views
0

제 질문은 자바와 관련이 없지만 디자인 패턴 질문과 같다고 생각합니다. 나는 예제를 설명하려고합니다 :두 가지 다른 동작으로 동일한 방법을 사용합니까?

나는 두 클래스 (A와 B)가, 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() 내부를 수정하고 싶습니다. 분명히 method1은 int를 출력하는 것이 아니라 더 많이 수행하기 때문에 두 개의 다른 method1()을 정의하고 싶지는 않습니다.

두 번째의 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

B 클래스에서'method1'을 덮어 쓰길 원합니다. –

+0

method1에 카운터를 추가 할 수 있습니다.이 카운터는 사용될 때마다 증가하고 해당 카운터를 두 번째로 호출 할 수 있습니다. – ryekayo

+0

@ Zéychin이 동의했습니다. 재정의에 새 비헤이비어를 작성해야합니다. –

답변

0

Java의 런타임에 메소드의 구현을 변경할 수있는 방법이 없습니다.

당신이 메소드를 오버라이드 (override)

, 그것은 예를 들어, 직접 슈퍼 클래스 구현을 호출 할 수 있습니다 다음을 변경하는 동안 그러나

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(); 
    } 
} 

, 이것은 당신이 기술 한 방법으로 사용할 수 없습니다 (방법 항목를 호출 방법 3 구현). 그리고 그것은 또한 당신이 묘사 한 것을 구현하는 데 매우 혼란스러운 방법 일 것입니다.

메쏘드 매개 변수를 사용해야하므로 매개 변수를 사용해야합니다.

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

두 경우 모두 하위 클래스의 method3이 호출됩니다. – manzur

관련 문제