2014-09-27 2 views
0

서브 클래스에서 개인 메소드를 확장/변경하는 문제가 있습니다. 예를 들어, 테스트에 사용하기 위해 수퍼 클래스에서 상속받은 mock 객체를 생성합니다. 여기 Java - 서브 클래스에서 개인 메소드 확장하기

내가 변경하고자하는 부모 클래스의 코드의 예입니다

private void build(int skill) { 
     // switch screen 
     state = Constants.STATE_GENERATING; 
     percentdone = 0; 
     notifyViewerRedraw() ; 
     // select generation method 
     switch(method){ 
     case 1 : mazebuilder = new MazeBuilderPrim(); // generate with Prim's algorithm 
     break ; 
     case 0: // generate with Falstad's original algorithm (0 and default), note the missing break statement 
     default : mazebuilder = new MazeBuilder(); 
     break ; 
     } 
} 

나는 개인 방법은 서브 클래스에서 덮어 쓸 수 없습니다 것을 알고있다. 그래서 저는 같은 서명의 새로운 방법을 만들어야합니다. 이 클래스의 모든 사설 변수도 다시 만들어야합니까? 하지만 그렇게하면, 그 공간이 서브 클래스의 부모 클래스의 private 변수를 위해 실제로 예약되어 있다는 것을 알기 때문에 그것이 부모 클래스와 다른 행동을 변경하는지 확실하지 않습니다. 따라서 개인 변수가 중복됩니다. 나는 최선의 방법이 이것에 접근하는 것이 무엇인지 모른다.

+0

오해의 소지가 있지만 부모님이 문제의 메소드와 변수를 비공개가 아닌 보호 할 수 없습니까? –

답변

2

하위 클래스에서 메서드를 재정의해야 할 필요가있는 경우 해당 메서드가 담당하는 논리는 public 또는 protected 메서드를 보증 할만큼 충분히 추상적 일 수 있습니다.

Strategy Pattern의 디자인을 고려하십시오. 기본적으로 private 메서드를 재정의 할 필요가 없습니다. 이러한 메서드는 인터페이스 외부의 항목에 대해 예약되어야하고 특정 구체적인 클래스에만 한정되어 있어야하기 때문입니다.

내게는 build()과 같은 것이 있습니다. 이것은 가장 높은 수퍼 클래스가 건설 중 어느 시점에서 사용할 수 있지만 외부에서 호출하면 안되는 protected 메서드로 속합니다. 물론, build()을 필요한만큼 (멱등수) 호출하는 것이 안전하다면, render() 메소드가 게임 캐릭터 클래스에 포함될 수있는 것처럼 공개로 설정하고 구현에 대한 기대치를 문서화하는 것이 안전해야합니다.

0

임 확실하지 않은 방법 프로그램이 전체 작동하지만 같은 방법 (?)

0

당신은 슈퍼를 호출 할 수 있습니다를 공유하는 기본 클래스의 모든 원한다면 당신이 추상 클래스와 메소드를 조사 가치가있을 수도 있습니다() superclasses 메소드를 호출 한 후 서브 클래스 메소드에 필요한 추가 변경 사항을 작성하는 서브 클래스 메소드에서.

편집 : 원래 질문을 잘못 읽었습니다. 메소드가 수퍼 클래스에 기능을 가지고 있고이를 확장하거나 변경하려는 경우이를 private으로 설정하면 안됩니다. super()를 사용하여 서브 클래스를 확장하거나 서브 클래스가 그것을 오버라이드 (override) 할 수 있도록 (듯이), Protected가 아마 최선의 방법 일 것입니다.

1

조롱 API를 사용하여 시도하십시오 (예 : Jmockit).

사용하면 사적인 방법으로 수업을 확장하는 경우와 같이 손목을 다루는 데 많은 어려움을 덜어줍니다! 행운을 빕니다.

관련 문제