2014-09-23 2 views
1

다른 클래스의 자손 클래스를 통해 수퍼 클래스의 메소드를 호출하려고합니다. 예를 들어Java에서 비 - 자체 클래스의 수퍼 클래스를 호출하십시오.

:

class B{ 
    CA mCA = new CA(); 
} 

이 방식이 있는가 : 클래스 A와 자식 클래스 CA는 A의 방법 F() 클래스 B의

class A{ 
    f(); 
} 

class CA extends A{ 
    @Override 
    f(); 
} 

는 CA의 인스턴스를 오버라이드 (override) CA 클래스 B에서 CA의 수퍼 클래스 (A)의 f() 메소드를 호출합니까?

mCA.super.f(); (I know its wrong) 

처럼 .... 어떤 도움

감사합니다 :)

+6

당신은 할 수 없습니다 - 그것은 캡슐화를 위반하는 것입니다. 이것은 속마귀 일 것이라고 확신하지만, 그것을 발견하는 데 시간이 걸릴 수 있습니다. –

+0

나는 추측 할 것이다 - 그러나 나는 정말로 모른다. 그리고 나는 발견 할 시간을들이는 데 신경 쓰지 않는다 - 당신이 성찰을 통해 그렇게 할 수 있다고 생각한다. 결국 리플렉션을 통해 비공개 메소드를 호출 할 수 있습니다. 그러나 당신은 이것을해서는 안됩니다. – emory

+0

@ 존 쉘킷 인은 예를 들어 [이 질문] (http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java). –

답변

4

간단히 NO.

클래스의 객체 메소드를 호출 할 수 있습니다.

왜 수퍼 클래스의 메서드를 호출 하시겠습니까?

이렇게해야 할 경우 클래스 디자인에 문제가 있습니다. CA은 자체 메서드를 만들어야하며 f()CA 클래스에 직접 호출하면 A 클래스의 메서드를 호출 할 수 있습니다.

또는 재정의 된 메서드는 원래 구현과 호환되어야합니다. 이 경우 수퍼 클래스의 메서드를 호출 할 필요가 없습니다.

+0

감사합니다 Uwe Plonus, 그것은 간접적 인 방법입니다. 하지만이 기능을 구현하는 유일한 방법 일 수 있습니다. 고마워. –

+0

메소드를 프록시에 위임해야 할 필요가있는 경우이를 수행해야 할 좋은 이유가 있습니다. 결국 프록시로 돌아와 원래의 메소드를 호출해야합니다. – ddyer

1

반사을 사용하여 캡슐화를 중단합니다. 이렇게 ...

추신 : 이것은 좋은 습관이 아닙니다. 이 코드는이 작업을 수행 할 수 있음을 보여줍니다.

class A { 
    public static void f() { 
     System.out.println("A"); 
    } 
} 

class CA extends A { 

    public static void f() { 
     System.out.println("CA"); 
    } 
} 

class B { 
    public static void main(String[] args) throws IllegalArgumentException, 
      SecurityException, IllegalAccessException, 
      InvocationTargetException, NoSuchMethodException { // got genuinely scared here.. 
     CA mCA = new CA(); 
     mCA.getClass().getSuperclass().getMethod("f", null).invoke(mCA, null); 

    } 

} 

O/P :

A 
+0

감사합니다. 그러나 f()가 정적 메서드 일 때만 사용할 수 있습니다. 비 정적 방법의 경우 작동하지 않습니다. –

관련 문제