2009-04-07 8 views
3

나는 이것이 가능하지 않아야한다고 생각하지만, 어쨌든 물어볼 것입니다. 어떻게 그것이 Parent에서 재정의 된 구현을 무시하고 Grandparent의 하나를 호출하는 Child 등의 myMethod()를 오버라이드 (override) 할 수퍼 클래스의 수퍼 클래스 메서드를 호출하는 메서드를 재정의하는 방법?

는 다음 클래스 계층 구조를 감안할 때 ( GrandparentParent은 나의 통제하에, 따라서 제 3 자로부터하고)?
class Grandparent { 
    public void myMethod() { 
     // do stuff 
    } 
} 

class Parent extends Grandparent { 
    @Override public void myMethod() { 
     super.myMethod(); 
     // do something else 
    } 
} 

class Child extends Parent { 
    @Override public void myMethod() { 
     // ??? I want to *only* do what Grandparent did here 
    } 
} 

Parent 클래스가 다른 도움이되는 행동을 많이 제공하고 내가 " Child Grandparent의 서브 클래스를 만드는"찾는 게 아니에요, 즉 ( Child의 계층 구조의 중요한 요소이다 척.

+0

중복 된 http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java. –

+0

그래, 같은 이유로 듀피로 투표. –

+1

투표 종료 - 중복. –

답변

10

상속 뒤에 아이디어를은 각 클래스가 필요로하는 방식을 정의하므로 모든 코드를 검사 할 필요가 없습니다.

여기 코드를 다시 사용하기 위해 서브 클래 싱을하는 것처럼 보입니다. 서브 클래 싱은 아닙니다.

서브 클래 싱하는 대신 필요한 작업을 수행하고 "Child"및 "Parent"클래스를 모두 "Grandparent"로 확장하는 헬퍼 멤버가 있어야 할 수도 있습니다.

당신이 스스로에게 물어볼 필요가있는 주요 질문은 "자녀는 부모, 조부모 또는 새끼의 자손인가?"입니다. 즉, 어린이의 모든 인스턴스에 대해 을 말하면, 그것이 부모이라고 할 수 있습니까?

응답이 아니오 인 경우

는, 당신은 잘못 서브 클래스있어 : 상속이 무언가를 뜻한다뿐만 아니라 코드 재사용 (즉 포드 또한 자동차, 그냥 "포드" 를 사용하지 "자동차"방법).

2

없음 가능.

나는 전화가 도우미를 대신 조부모의 final 도우미 메서드를 만듭니다. 그리고 (무시하는)이 방법을 것이다.

class Grandparent { 
    public final void myHelperMethod() { 
     // do stuff 
    } 
    public void myMethod() { 
     myHelperMethod(); 
    } 
} 

class Parent extends Grandparent { 
    @Override public void myMethod() { 
     super.myMethod(); 
     // do something else 
    } 
} 

class Child extends Parent { 
    @Override public void myMethod() { 
     // ??? I want to *only* do what Grandparent did here 
     myHelperMethod(); 
    } 
} 
+0

감사합니다. 비슷한 일을 할려고했지만 조부모 클래스의 "제어"가 없으므로 직접 메서드를 다시 구현해야합니다. –

+0

@Steve Reed : 하위 클래스에 대한 제어 권한 만있는 경우 수행 할 수있는 일은별로 없습니다. –

2

부모 클래스를 제어 할 수 있습니까?

그렇다면 조부모에 myMethod를 호출하고 Child에서 myNewMethod를 호출하는 부모에게 메서드 (myNewMethod)를 추가 할 수 있습니까?

는 (I 자바 사람이 아니다, 그래서 당신은 단지 서브 클래스에서 메소드의 재정의 수퍼 클래스의 메소드를 호출 할 수 있는지 모르겠다)

class Grandparent { 
    public void myMethod() { 
     myHelperMethod(); 
    } 
} 

class Parent extends Grandparent { 
    @Override public void myMethod() { 
     super.myMethod(); 
     // do something else 
    } 
    public final void myNewMethod() { 
     super.myMethod(); 
    } 
} 

class Child extends Parent { 
    @Override public void myMethod() { 
     // ??? I want to *only* do what Grandparent did here 
     myNewMethod(); 
    } 
} 
3

단순히 완전히 상속을 남용 내가 부모 또는 조부모의 코드를 만지지 수 있다고 가정하면 셉은 (스티브 분명히 동의하고) 제안 내가 아니에요 가정 :

나는 지역을 만들 것 Grandfather 객체 (또는 추상적 인 경우 할아버지를 확장하는 로컬 클래스)의 인스턴스이며 myMethod()에 대한 해석에 직접 액세스 할 수 있습니다. 물론 myMethod()가 읽거나 조작해야하는 상태 정보의 양에 따라 관련된 작업의 양은 "쉬운"에서 "극심한"것까지 될 수 있습니다.

이것은 추한 해결책이며, 얼마나 많은 주 정보에 액세스했는지에 따라 지옥처럼 부서지기 쉽습니다. 그러나 할아버지가 안정적으로 안정적이거나 myMethod()가 상당히 독립적 인 경우 작동 할 수 있습니다. 악마는 항상 그렇듯이 세부 사항에 있습니다.

Seb는 상속이 아니라 재사용한다는 것에 분명히 동의합니다. 그러나, 헤이. 재사용은 종종 좋은 일입니다.

+0

상속 대신 위임 +1 – gtrak

관련 문제