2011-10-24 5 views
3

인터페이스를 구현하는 인터페이스와 클래스에 대한 질문이 있습니다.클래스로의 Java 캐스트 인터페이스

이 내 코드입니다 :

interface iMyInterface { 
    public iMethod1(); 
} 

public class cMyClass implements iMyInterface { 
    public iMethod1() { 
     // some code 
    } 
    protected iMethod2() { 
     // some code 
    } 
} 

나는이 같은 iMyInterface의 인스턴스를 생성하고 싶습니다 :

iMyInterface i = new cMyClass(); 
i.iMethod1(); 

괜찮아,하지만 어떻게 내 인터페이스 인스턴스에서 iMethod2()를 호출 할 수 있습니다? 작동하고 안전합니까?

((cMyClass)i).iMethod2(); 

감사합니다.

답변

7

예, (당신이 iMyInterface을 구현하는 cMyClass의 선언을 변경하는 경우)이 작동하고 그것은 너무 오래 참조가 정말 cMyClass의 인스턴스를 참조처럼 안전합니다.

그러나 일반적으로 나쁜 생각입니다. 인터페이스를 사용하는 요점은 구현과 함께 작동 할 수 있다는 것입니다. 구현과 추상화를 분리하는 것입니다. 특정 구현을 요구할 경우 i 유형을 단지 cMyClass으로 시작하도록 할 수 있습니다.

그래서 대신 cMyClass 생성자를 직접 호출하는 가정, 당신은 유형 iMyInterface하는 방법 매개 변수를받을 - 그것은 인터페이스의 다른 구현 될 수로는, 그 시점에서 cMyClass 캐스팅 나쁜 생각입니다.

(별도의 노트에, 그것은 클래스와 인터페이스가 파스칼 - 맡았다해야한다고하는 상태, 자바 명명 규칙을 다음 시작하는 것이 좋습니다 -. 그래서 ci 접두사 도랑)

+1

나는 그가 캐스팅 할 예정이라면 캐스팅을 'instanceof'로 확인해야하며 안전한쪽으로 가야한다고 생각합니다. –

+0

@ S.L.Barth : 어쨌든 원하는 실패 모드가 ClassCastException이 아닌 한, 물론 무조건적인 캐스트가 괜찮은 경우. –

+0

@Jon Skeet 감사합니다. 이제 인터페이스에 Method2를 포함하여 사용하고 있습니다. 죄송합니다 ** 샘플에 iMyInterface ** 구현 ** 추가 잊어 버렸습니다. – TheFrancisOne

0

그것은 (작동합니다 cMyClass가 iMyInterface를 구현하고 사용자가 의 보호 범위 수정 자임)하지만 올바른 OO 승인이 아닙니다. 당신이 iMethod2 고려해야 사용하려면

:

  • 인터페이스
  • 에 추가하는 방법
  • 사용을 포함하는 다른 인터페이스를 만들 cMyClass myClass = new cMyClass();
+0

감사합니다. 내 인터페이스에 Method2를 추가합니다. – TheFrancisOne

0

일부는 캐스팅 다른 대안이있다 클래스 인터페이스. 방법은 다음과 같습니다.

interface iMyInterface { 
    void iMethod1(); 
} 

public class cMyClass implements iMyInterface { 

private iMyInterface myInterface; 

public cMyClass() { 
    myInterface = this; 
} 

public void iMethod1(){ 
    System.out.println("Print from cMyClass iMethod1()"); 
} 

protected void iMethod2() { 
    System.out.println("Print from cMyClass iMethod2()"); 
} 

/** 
* Getter so we can access to the interface methods. 
* @return 
*/ 
public iMyInterface getMyInterface() { 
    return myInterface; 
} 
} 

그리고 인터페이스에서 값을 얻으려면 다음 코드 예제를 참조하십시오.

public class Main { 
public static void main(String[] args) { 

    cMyClass myClass = new cMyClass(); 
    myClass.getMyInterface().iMethod1(); 
    myClass.iMethod2(); 
} 
} 

출력 : CmyClass에서 iMethod1() CmyClass에서 iMethod2()

나는 이것이 당신이 클래스 코드에서 인터페이스 코드를 분리 할 수있는 방법 좋은 예입니다 생각에서

인쇄에서

인쇄 . 인터페이스의 인스턴스를 생성하면 모든 인터페이스가 getter를 통해 사용됩니다.