2012-08-22 2 views
0

자식 생성자에서 가져온 값이 필요하므로 생성자에서 자식 메서드로 템플릿 메서드를 호출하는 자식 클래스를 확장하는 자식 클래스가 필요합니다.템플릿 메서드는 자식 생성자에 선언 된 객체를 필요로합니다.

어떻게 부모 생성자 (푸, 여기에 내가 진짜 푸 클래스의 변경을 할 수 없습니다.) 변경하지 않고, 같은 것을 할 수있다 : 나는 년을 aValue를 넣어 경우에도 여기에

public abstract class Foo{ 
    public Foo(){ 
     register(); 
    } 

    public abstract void register(); 

    public void aMethod(int aValue){ 
     // body 
    } 

} 

public class Bar extends Foo{ 

    public Foo(int aValue){ 
     // body 
    } 

    register(){ 
     aMethod(aValue); 
    } 
} 

을 필드에서 aValue도 생성되지 않습니다.

aMethod(aValue);. 

문제를 어떻게 해결할 수 있습니까?

나는 ULM이라는 어떤 패턴을 찾고 있습니다.

답변

2

자식 생성자에서 가져온 값이 필요하기 때문에 생성자에서 자식 메서드로 저장되는 템플릿 메서드를 호출하는 자식 클래스를 확장하는 자식 클래스입니다.

하위 클래스 생성자가 값을 수퍼 클래스 생성자에 전달하지 않는 이유는 무엇입니까?

public abstract class Foo { 
    protected Foo(int value) { 
     ... use value ... 
    } 
} 

public class Bar extends Foo { 
    public Foo(int value) { 
     super(value); 
    } 
    ... 
} 

생성자에서 가상 메소드를 호출하는 것은 위험한 방법입니다. 서브 클래스는 아직 초기화하지 않았기 때문에 위험합니다.

+0

기껏해야 스케치 인 호출 하위 클래스 메서드에 대해 +1. 그리고 직면하자, 당신은 대표가 필요합니다. –

+0

수퍼 클래스는 개인 프레임 워크에서 사용하기 때문에 작업에 사용하며 클래스는 읽기 전용입니다. 나는 그것이 위험한 습관이라는 것을 알고 있지만, 나는 더 나은 길을 찾지 못했다. 아마도 그것을하는 더 좋은 방법이있을 것인가? –

+0

@ Pier-alexandreBouchard : 더 이상 문맥없이 말할 수는 없습니다. 수업이 근본적으로 잘못 설계된 경우 디자인 수정을 캠페인해야합니다. 그렇지 않으면 기본적으로 목적에 맞는 소리가 들리지 않습니다 ... –

0

클래스 구조가 엉망입니다. 부모에게 바꿀 수없는 기존 코드에 뭔가가 있습니까? 변경하지 않으면 :-)

0

생성자에서 추상 메소드를 호출하는 것은 좋지 않습니다. PMD와 같은 일부 도구는 기본적으로 경고로 표시합니다 (또는 오류 일 수도 있습니다). 내가 생각하기에 여기 어떤 패턴에 대해서 이야기하는 것은 어렵다. 내가 뭘 것이라고 바 클래스를 구현하는 것입니다.

public class Bar extends Foo{ 

    private int aValue; 
    private boolean initialized = false; 


    public Bar(int aValue){ 
     this.aValue = aValue; 
     initialized = true; 
     register(); 
    } 

    public void register(){ 
     if (initialized) 
     aMethod(aValue); 
    } 


}