2012-05-29 6 views
-1

추상 수퍼 클래스를 추출하는 클래스를 리팩토링해야합니다. 예.Java에서 수퍼 클래스의 중첩 클래스를 이동하는 방법은 무엇입니까?

UpperClass { 
NestedClass { 
UpperClass.this.someMethod(); 
} 
} 

처럼 : 나는이 개 클래스 UpperClass1 및 UpperClass2에 AbstractUpperClass을 상속 계획 후

AbstractUpperClass { 
    NestedClass { 
    ?????.this.someMethod(); 
    } 
} 

. 그러나 클래스를 감싸는 inovokes 메서드 때문에이 내부 클래스를 리팩토링하는 방법을 모르겠습니다. 가능합니까? 감사합니다. .

+2

"위"라고 말하면 "최고"를 의미합니까, 아니면 다이아몬드 축하 소프트웨어일까요? 8 = \/ – davidfrancis

+0

AbstractUpperClass.this.someMethod() 만 사용하십시오 – Yura

+3

코드를 이해할 수 없습니다. 유효한 [SSCCE] (http://sscce.org/)를 제공 할 수 있습니까? –

답변

0

여기서 속임수 란 내부 클래스가 어떻게 작동 하는지를 아는 것입니다. 그것은 본질적으로 단순한 "정상적인"정적 클래스이지만 생성자가 암시 적으로 포함하는 클래스에 대한 참조를 가져옵니다. 그래서,이 :

public class TopLevel { 

    public void go() { 
     new Inner().bar(); 
    } 

    public void foo() { } 

    public class Inner { 
     public void bar() { 
      TopLevel.this.foo(); 
     }   
    } 
} 

이하는 것과 같습니다 그래서

public class TopLevel { 

    public void go() { 
     new Inner(this).bar();   // explicitly passing in "this" 
    } 

    public void foo() { } 

    public static class Inner { 
     private final TopLevel parent; // note that we have this new field 

     public Inner(TopLevel parent) { // note this new constructor 
      this.parent = parent; 
     } 

     public void bar() {    // we use the explicit reference instead 
      parent.foo();    // of the implicit TopLevel.this 
     }   
    } 
} 

, 말했다 모두와 함께, 귀하의 내부 클래스를 리팩토링하는 방법은 최상위 클래스가 명시 적으로 필드를 추가하는 것입니다 수 UpperClass 인스턴스를 참조하고이 참조를 NestedClass 생성자에 전달합니다. 즉, 첫 번째 코드 대신 두 번째 코드 스 니펫과 같아야합니다.

관련 문제