2013-12-10 3 views
0

TeachingAssistantStudent 인 사람은 Person입니다. 방법 x()이 나는 ​​TeachingAssistant의 인스턴스가 모두 StudentPerson 경우클래스의 수퍼 클래스가 모두 같은 메서드를 가지고 있다면, 호출 할 수퍼 클래스를 구분하는 방법은 무엇입니까?

, 어떻게 학생의 x() 방법과 사람의 x() 메소드를 호출 구별합니까?

유효한 전화는 super.super.x()입니까? 정말,

package supersuper; 

import static java.lang.System.out; 

interface Human { 

    String x(); 
} 

class Person implements Human { 

    public String designation; //bad idea 

    Person() { 
     designation = x(); 
    } 

    @Override 
    public String x() { 
     return "Person"; 
    } 
} 

class Student extends Person { 

    Student() { 
     super(); 
    } 

    @Override 
    public String x() { 
     return "Student"; 
    } 
} 

class TeachingAssistant extends Student { 

    TeachingAssistant() { 
     super(); 
    } 
} 

public class SuperSuper { 

    public static void main(String[] args) { 
     TeachingAssistant ta = new TeachingAssistant(); 
     out.println(ta.designation); 
    } 
} 

당신이 원하는 것을 몰라 :

+0

정말로 'super.super'가 필요한 경우 디자인 문제가 있다고 말하고 싶습니다. 하나의 클래스 계층 구조에서 너무 많은 일을 할 것이고 일부 기능은 별도의 클래스로 나갈 필요가 있습니다. 작문은 상황에 따라 상속보다 좋은 패턴 일 수 있습니다. – jpmc26

+0

예, 일부 코드는 무엇이 요청되는지 명확히하기 위해 길어질 것입니다. – Thufir

답변

0

다음 코드의 많은, 많은 나쁜 아이디어가 있습니다. 일부 컨텍스트의 출발점으로 일부 코드를 게시하십시오. 그러나 아니오, 주석별로 super.super.x()를 호출 할 수 없습니다.

나는 당신에게 당신의 질문을 세련시키기 시작했습니다.

0

먼저 클래스 계층 구조가 문제 도메인과 실제로 일치하는지 다시 생각해보십시오. 부모에서 재정의 된 조부모 구현을 특별히 호출해야하는 경우 다음 두 가지 중에서 선택할 수 있습니다.

첫 번째 선택. 조부모에 별칭 메서드를 추가합니다.

class grandPa { 
    int foo() { 
     return myfoo; 
    } 
    // Alias method 
    int grandPaFoo() { 
     return foo(); 
    } 
} 
class Pa extends grandPa { 
    int foo() { 
     return bar; 
    } 
} 

class Child extends Pa { 
    int foo() { 
    if (x>3) { 
     // User parent implementation 
     super.foo(); 
    } else { 
     // User grandparent implementation via alias 
     grandPaFoo(); 
    } 
} 

두 번째 선택. 상속 대신 컴포지션을 사용하십시오.

관련 문제