2014-06-08 5 views
-1

다음은 내 코드입니다. 나는 myMethod 메서드를 가진 추상 클래스 Myabatract을 가지고 있고 서브 클래스가 MySubClass인데 myMethod을 재정의했다. 내 클라이언트 클래스에서 callMethodmyMethodMyabatract 클래스로 직접 호출하고 싶습니다.이 방법이 가능합니까?Java에서 계층 구조가 아닌 클래스에서 추상 메서드를 호출하는 방법

abstract class Myabatract { 

public void myMethod() { 
    System.out.println("This is from Myabatract"); 
} 

} 

class MySubClass extends Myabatract { 
public void myMethod() { 
    System.out.println("This is from MySubClass"); 
    super.myMethod(); 
} 
} 


class Client{ 
public void callMethod(){ 

} 
} 
+0

왜이 작업을 수행 하시겠습니까? 그것은 OOP의 목적을 이기고 있습니다. 서브 클래스가 그 부모의 메소드를 오버라이드 (override)하고있는 경우는, 그 메소드가 제공 한 문맥에서만 의미가 있다고 말하는 것입니다. 서브 클래스가 수퍼 클래스의 메소드 구현을 사용해야 할 경우 메소드 오버라이드 내에서 적절하게 "super"를 호출해야합니다. – aruisdante

답변

2

abstract class의 익명 구현을 만들 수 있습니다. 이는 abstract 메쏘드를 사용하지 않는다는 사실을 고려하면 특히 쉽습니다. MySubClass 유형의 사용자로서

class Client { 
    public void callMethod() { 
    Myabatract instance = new Myabatract() { /* nothing to implement*/ }; 

    instance.myMethod(); 
    } 
} 

, 당신은 그것을 무시 되었기 때문에 MySubClass가 노출했다 않는 한 Myabatract 메소드를 호출 할 수있는 방법이 없습니다. 유일한 방법은 MySubClass (또는 다른 하위 구현물)에서 super 메서드를 노출하는 다른 메서드를 만드는 것입니다.

그것은주의하는 것이 중요하다 그이 것 하지 일 :

class Client { 
    public void callMethod() { 
    MySubClass instance = new MySubClass() { 
     @Override 
     public void myMethod() { 
     super.myMethod(); 
     } 
    }; 

    instance.myMethod(); 
    } 
} 

super 아무것도 실제로 변경되지 않는 것을 의미 비 익명 클래스, MySubClass이다. 흥미롭게도이 방법은 범위 분석 연산자 (::)를 사용하여 C++에서 처리 할 수 ​​있습니다.

MySubClass 구현에서 super.myMethod()을 호출하고 Myabatract 메서드를 호출하는 것도 중요합니다.

관련 문제