2009-10-26 7 views
10

클래스 A가 있고 하위 클래스 B를 작성합니다. A에는 매개 변수화 된 생성자가 하나만 있습니다. B가 A의 상위 생성자를 호출해야합니다.이제 매개 변수로 Object를 사용하고 싶습니다. 이 객체는 B의 메소드를 호출해야합니다. 따라서 매개 변수 객체는 B의 참조를 보유하거나 내부 클래스 여야합니다. 지금은 같은 생성자를 호출 할 때슈퍼 생성자를 호출하는 동안 "this"를 참조 하시겠습니까?

public B(){ 
    super.(new parameter(this)) 
} 

... 이클립스는 말한다 :

는 '이'도 '슈퍼'를 참조 할 수 없습니다 명시 적으로 생성자

를 호출하는 동안 이 문제를 해결하기 위해 볼 수있는 유일한 방법은 매개 변수 개체에 "this"-instance를 삽입하는 set-method입니다. 나는 수퍼 클래스를 편집하고 싶지 않다.

이 문제를 해결하는 더 좋은 방법이 있습니까?

+0

* 언어 *는 무엇입니까? –

+11

태그를보십시오 Jonathan ... its java – craftsman

답변

17

컴파일러가 실제로 여기에서 발을 쏘는 것을 방해합니다. B는 슈퍼 생성자를 호출 할 때까지 완전히 생성되지 않습니다. 따라서 컴파일러가이를 허용하면 이것을 참조로 전달하고 B에 대한 메소드를 호출하면 B는 유효하지 않은 상태가되어 모든 종류의 원인이됩니다 (사실, A는 아직 초기화되지 않았으며, Object를 포함하여 어떤 클래스도 체인을 따라 올라가지 않습니다).

명백한 해결책은 B 외부의 기능을 제공하고 매개 변수의 생성자에 전달하는 것입니다. 특정 솔루션은 특정 문제에 따라 다르지만 B 내부의 정적 중첩 클래스 (동일한 이유로 정적이어야 함 - 내부 클래스가 외부 클래스 인스턴스에 대한 암시 적 참조를 가짐)가 해당 기능을 제공 할 수 있습니다. 매개 변수 B와 수퍼 클래스 간의 관계를 재고해야 할 수도 있습니다. 그것은 모두 사건에 달려 있습니다.

+0

나는 그것을 해결하는 방법을 안다. 진짜 문제는 수퍼 클래스가 "오래된"코드라는 것입니다. 나는 조금 다른 맥락에서 그것을 재사용하고있다. 나는 우아한 해결책을 찾고 있었다. 하지만 나는 없다고 생각합니다. The는 이전 코드를 재사용하는 가격입니다. –

+2

새로운 클래스를 이전 클래스를 감싸는 래퍼로 배치하면됩니다. 이전 클래스가 새 객체로 구현할 수있는 인터페이스를 구현합니까? – Joe

+1

@ c0d3x, 당신은 당신의 솔루션을 (별도의 질문으로) 게시하고 좀 더 우아한 해결책이 있는지 물어볼 수 있습니다. 귀하의 솔루션을 보는 것은 관련된 특정 사건에 대한 많은 질문에 답할 수 있습니다. – Yishai

관련 문제