2011-10-09 3 views
0

일반적으로 super로 오버라이드 된 메소드를 호출 할 수 있습니다. 예를 들면 :Java에서 다른 클래스의 public override 메소드를 호출 할 수 있습니까?

public class SuperClass { 
    public void something() { 
     out("called from super"); 
    } 
} 

public class SubClass extends SuperClass { 
    @Override 
    public void something() { 
     out("called from sub"); 
     super.something(); // This is fine 
    } 

    public static void main(String[] args) { 
     new SubClass().something(); // Calls both methods 
    } 
} 

하지만 다른 클래스에서 super.something() 메서드를 호출 할 :이게 가능

public class SubClass2 extends SuperClass { 
    @Override 
    public void something() { 
     out("called from sub2"); 
     new DecidingClass().maybeCallSuperSomething(this); 
    } 

    public static void main(String[] args) { 
     new SubClass2().something(); 
    } 
} 

public class DecidingClass { 
    public void maybeCallSuperSomething(SuperClass visitor) { 
     boolean keepGoing = true; 
     // Do some work, maybe set keepGoing to false 
     // ... 
     if (keepGoing) { 
     // How do I call the Overridden method? 
     visitor.something() // Causes recursive loop 
     // visitor.super.something() ???? 
     } 
    } 
} 

? 나는 그 자리에서 일할 것이지만 조금은 어색하다.

답변

3

짧은 대답, 아니요.

슈퍼 클래스 구현은 하위 클래스를 직접 표시하는 경우에만 표시됩니다. 외부 클래스는 어쨌든 메소드의 개별 구현 기능을 인식해서는 안됩니다. 커플 링 = 나쁜.

아마도 이것이 필요한 경우 디자인을 다시 방문해야합니다.

+1

+1이 아이디어는 LSP에 캡처됩니다 : 그것은 부끄러운 http://en.wikipedia.org/wiki/Liskov_substitution_principle – spatulamania

+0

, 나는 그것이 방법은 수 있는지 여부를 결정하는 빠른 방법으로 이어질 수 생각 불렀다. 해결 방법은 간단합니다. 하위 메서드 내에서 super 메서드를 호출하면됩니다. if (new DecidingClass(). decide (this)) {super.something(); } – mekazu

0

당신은 슈퍼 메소드를 호출 할 수 없습니다 - 그것은 자바 사양의 일부지만, 여기 (못생긴) 옵션들 :

public class SuperClass { 

    public void something(boolean invokeSuper) { 
     // do something 
    } 
} 

public class SubClass extends SuperClass { 

    public void something(boolean invokeSuper) { 
     if (invokeSuper) { 
      super.something(); 
     } else { 
      // do something 
     } 
    } 
} 
0

이 조금 분명하다,하지만 ... 일반적인 방법을 처리하는 이것은 기본 클래스 메소드의 본문을 별도의 메소드로 추출하므로 직접 호출 할 수 있습니다. 퍼포먼스와 오버라이드 할 수 없다는 점을 강조하기 위해 최종 결과를 원할 수 있습니다.

public class SuperClass { 
    public void something() { 
     doSomething(); 
    } 
    public final void doSomething() { 
     out("called from super"); 
    } 

} 

public class DecidingClass { 
    public void maybeCallSuperSomething(SuperClass visitor) { 
     // ... 
     visitor.doSomething(); 
     // ... 
    } 
}