2016-07-20 1 views
0

저는 C# Unity3D 개발자이고 최근에 일하고있는 안드로이드 게임용 플러그인을 만들기 위해 자바로 뛰어 들었습니다. 간단히 말해,이 플러그인의 목적은 플레이어가 자신의 휴대 전화에서 호스팅하는 상대방이 다른 사람이 LAN에서 찾을 수 있도록 브로드 캐스트 할 수 있도록 자바 네트워킹 기능을 사용하는 것입니다.열거 형 <T>은 어디에 구현 되었습니까?

이 플러그인의 경우 장치의 모든 네트워크 인터페이스를 가져오고 모든 로컬 링크 또는 루프백 IP를 필터링 한 다음 (나머지 1 개의 주소가 있어야한다고 가정) 방송용 나머지 주소를 사용해야합니다 . 나는 성공적으로 이런 짓을했지만, 나는 내 코드의 라인으로 방해 도움이되지 수 :

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 

내가 최근에 사물의 내부 동작에 대한 자세한 궁금하게했습니다. Unity3D는 훌륭한 API와 문서를 가지고 있습니다.하지만 최근에는 포함 된 IDE (MonoDevelop)를 사용하여 관리되는 소스 코드를 보았습니다. 일을 어떻게 처리하는지 더 잘 이해할 수 있도록 도와주었습니다. 그래서이 질문은 실제로 다시 한번 나의 호기심을 돕고 있습니다.

나는 C#에서조차도 인터페이스를 다루지 않았기 때문에이 부분을 혼란스럽게하려고 노력하고있다.

그래서 ... 열거 형은 암시 적으로 추상화 된 인터페이스이며 그 기능도 있습니다. 즉, 클래스는 해당 기능의 동작을 정의하기 위해 구현해야합니다.

docs.oracle.com에서 NetworkInterface를 보면 Enumeration을 구현하는 것처럼 보이지 않지만 작동하는 nextElement() 함수로 NetworkInterface 유형의 열거 형을 반환하는 함수 (위 그림 참조)가 있습니다. 뿐만 아니라 Enumeration이 인터페이스이기 때문에 함수가 어떻게 나를 제공 할 수 있습니까? 추상 클래스와 같은 인터페이스는 인스턴스화 할 수 없지만 호출 할 수있는 정의 된 함수로이 Enumeration 인스턴스를 받았으며 요청한 네트워크 인터페이스를 보유하고 있습니다.

열거 형을 구현 한 일부 (분명히 비 추상적) 유형의 객체를 나에게 반환 한 경우 아마도 NetworkInterface 형식의 개인 배열을 보유하고 있었을 것입니다.이 모든 것이 나에게 더 의미가 있다고 생각합니다.

미리 감사드립니다. docs.oracle.com에 NetworkInterface를 보면

+0

인터페이스는 계약서와 같습니다. 언급 한 메소드는'java.util.Enumeration'에 의해 정의 된 계약을 따르는 객체를 반환하지만 그 이상으로 약속하지는 않습니다.이것은 구현에 클라이언트가 신경 쓰지 않고 (또는 알지 못해도) 구현을 변경할 수 있도록하는 데 유용합니다. – biziclop

+2

다음 번 제안 : 위의 무관 한 박람회가 ** 많이 ** 있습니다. 귀하의 질문을 명확하고 간결하게 묻는 것이 좋습니다. 이 경우 약 3 문장 길이가 될 수 있습니다. –

+1

@ T.J.Crowder Noted. 죄송합니다. 사람들이 내 지식 수준에 대한 아이디어를 갖고 있고 코드가 작동하지 않는다는 것이 문제가 아니라 어떻게 작동하는지에 대한 질문 이었기 때문에 배경 정보를 제공하고 싶었습니다. – isNull

답변

3

, 그것은 NetworkInterface자체Enumeration을 구현하는 훨씬 이해가되지 것

올바른 ... 열거를 구현하는 표시되지 않습니다 그것은 열거가 아니므로. 대신 Enumeration<NetworkInterface>을 구현하는 데 사용하는 내부 클래스이 있으며 getNetworkInterfaces에서받는 클래스의 인스턴스입니다.

이것은 일반적인 패턴입니다. 당신은 당신의 JDK에서 src.zip에서 NetworkInterface.java 파일의 구현은 설치 볼 수 있습니다 :이 경우

public static Enumeration<NetworkInterface> getNetworkInterfaces() 
    throws SocketException { 
    final NetworkInterface[] netifs = getAll(); 

    // specified to return null if no network interfaces 
    if (netifs == null) 
     return null; 

    return new Enumeration<NetworkInterface>() {    // This is the 
     private int i = 0;         // anonymous 
     public NetworkInterface nextElement() {    // inner class used 
      if (netifs != null && i < netifs.length) {  // to implement 
       NetworkInterface netif = netifs[i++];   // Enumeration<NetworkInterface> 
       return netif;         // 
      } else {           // 
       throw new NoSuchElementException();   // 
      }             // 
     }              // 
                   // 
     public boolean hasMoreElements() {     // 
      return (netifs != null && i < netifs.length);  // 
     }              // 
    };              // 
} 

, 그것은 익명의 내부 클래스입니다. 다른 경우에는 Itr, AbstractList.java (예 : src.zip)과 같은 내부 클래스로 명명됩니다.

+0

감사합니다. 나는 내가 익숙하지 않은 주제라고 생각하는 내부 및 익명의 수업에 대한 연구를해야 할 것이다. 신택스는 그것을 구현하는 타입의 새로운 객체가 아니라 Enumeration 인터페이스의 새로운 인스턴스를 리턴하는 것처럼 보이기 때문에 조금 혼란 스럽다. (그러나 그것은 익명 클래스의 트릭이어야한다). https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html을 시작하는 것이 좋습니다. – isNull

+0

@ hey-m8 : 그렇습니다. 바로 시작할 수 있습니다. 그리고 예, 구문은 실제로 새로운 인스턴스를 만듭니다. 한 번에 두 가지 일을하고 있습니다 :'Enumeration '**와 **를 구현 한 익명 클래스를 생성하고 즉시 그 클래스의 인스턴스를 생성하고 그것을 반환합니다. –