2010-01-13 4 views
4

자바에서 극복하는 방법을 모르는 디자인 문제가 있습니다. 부모 생성자에서 호출되는 메서드를 재정의하려고합니다. 여기에 문제의 매우 간단한 예입니다 :상위 생성자에서 사용되는 메서드를 재정의하는 방법은 무엇입니까?

public class Parent { 
    public Parent(){ 
     a(); 
    } 

    public void a() { 
     // CODE 
     return; 
    } 
} 

public class Child extends Parent { 
    public Child() { 
     super(); 
    } 

    public void a() { 
     super.a(); 
     // MORE CODE 
     return; 
    } 
} 

내가 부모가 따라서() 메서드를 실 거예요 호출 할 차일을 구성 할 때까지 자식 클래스가 늘 초기화 할 수 있음을 알고있다. 이 문제를 극복하기위한 올바른 설계는 무엇입니까?

+2

'Child extends Parent'가 아니어야합니까? – BalusC

+1

죄송합니다, thanks :) – eliocs

답변

7

자식 오버라이드가 호출되지만 자식 생성자가 아직 실행되지 않았으므로 부분적으로 초기화 된 개체에서 호출되도록 설계되어 있지 않으면 쉽게 문제가 발생할 수 있습니다. 가장 좋은 방법은 입니다. 생성자에서 가상 메소드를 호출하지 않는 것입니다.. 단지 입니다. 둘 다 수업을 통제하고 있습니까? 문제를 피하기 위해 재 설계 할 수 있습니까?

+0

하위 클래스에 정의 된 속성을 사용해야하므로 상위 클래스의 디자인을 변경할 수 있습니다. – eliocs

+1

하위 생성자는 생성자 인수를 통해 수퍼 클래스 생성자까지 정보를 전달할 수 있습니까? –

+0

그 옵션을 생각했지만 최선의 옵션으로 보이지 않았다. 나는 a() 메서드를 생성자에서 분리하고 super() 및 a()를 호출하여 하위 생성자를 호출 할 생각이다. – eliocs

2

아이 a() 이됩니다.

생성자에서 a()를 호출하면 재정의하는 메서드를 호출하지 않는다는 가정은 C++에서는 정확하지만 Java에서는 올바르지 않습니다. 실제로 하위 클래스의 필드 초기화는 발생하지 않지만 생성자에서 메서드를 호출 할 때 재정의 할 수 있습니다.

[편집]

분명히 당신은 전화에주의해야하며 일반적으로 위험한 연습 간주됩니다.

+1

.. 그리고 이것은 문제를 일으킬 것입니다. –

관련 문제