2010-01-08 3 views
1

"A"메서드를 재정의하고 추가 기능을 추가하는 클래스 "A"및 로컬 클래스 "B"가있는 외부 API가 있습니다 (수정할 수 없음). 일부 매개 변수 "is_A"에 따라 그 중 하나를 사용해야합니다.외부 API 기능을 확장하는 Java 클래스

/------ API (A.java) -----/

package A; 

public class A { 

    public int pingA(int value) { 

     return value; 

    } 

} 

/------ 내 수업 (B.java) --- -/

package B; 

import A.*; 

public class B extends A { 

    @Override 
    public int pingA(int value) { 
     return value; 
    } 

    public int pingB(int value) { 
     return value; 
    } 

    public static void main(String[] args) { 
     final boolean is_A = false; 
     A obj; 
     if (is_A) { 
      obj = new A(); 
     } else { 
      obj = new B(); 
     } 
     if (!is_A) { 
      int n = obj.pingB(3); 
     } 
    } 
} 
I 클래스 "B"를 사용하고 싶은 경우에는이

하지만 명령 "INT obj.pingB N = (3);" 어떤 방법 pingB는 A. 정확한 메시지가 없기 때문에 컴파일되지 않는 것은 :

cannot find symbol 
symbol: method pingB(int) 
location: class A.A 

답변

2

castobjB으로 돌아 가야합니다.

if (!is_A) { 
    int n = ((B) obj).pingB(3); 
} 

당신은 방법에 의해 더 나은 대신 is_Ainstanceof 키워드를 사용할 수 있습니다. > 바인딩 유형이 컴파일 작동하지 않습니다 이런 식으로 - (-> 당신은 OBJ 선언)

if (obj instanceof B) { 
    int n = ((B) obj).pingB(3); 
} 
+0

감사 많은이 작동합니다. 이 접근 방식 (즉, 캐스팅)은 처리 속도에 영향을 줍니까? – Serg

+0

아니요, 물론 아닙니다. – BalusC

7

당신은 슈퍼 클래스에 존재하지 않는 서브 클래스에 새로운 메소드를 추가하고 있습니다. 수퍼 클래스에 대한 참조를 사용하여 서브 클래스에서 새 메소드를 호출 할 수있는 방법은 없습니다. 새 메서드를 사용하려면 하위 클래스 유형으로 캐스트해야합니다.

당신은 같은 것을 할 수있는 : 여기 B

A obj = new B(); 

if (obj instance of B) { 
    B b = (B)obj; 
    int n = b.pingB(3); 
} 

A하지만 A 그렇게는 pingB (int) 메소드가없는 B되지 않습니다.

0

OBJ는 여전히 A 형을 가지고있다.

1

메서드를 호출하려면 파생 클래스에 캐스트해야합니다. 일반적으로 그와 if(obj instanceof B) 이루어집니다하지만 당신은 이미 정보 부울이로는 다음과 같이 것 :

public static void main(String[] args) { 
    final boolean is_A = false; 
    A obj; 
    if (is_A) { 
     obj = new A(); 
    } else { 
     obj = new B(); 
    } 
    if (!is_A) { 
     int n = ((B) obj).pingB(3); 
    } 
} 
관련 문제