2012-01-12 3 views
1

저는 Java에 익숙하지 않습니다. 글쎄, 나는 인터페이스가 구체적인 서브 클래스에 의해 구현 될 추상 메소드만을 제공한다는 것을 안다. 희망이 사실 (적어도). 그래서 내가 작성하고 엑셀 파일을 읽고, JXL API의 샘플 코드를 공부하고, 나는이 점에 도착 :jxl api : writablesheet가 인터페이스 인 이유는 무엇입니까?

입니다
workbook = Workbook.createWorkbook(new File("/home/me/workspace/files/output.xls")); 
WritableSheet sheet = workbook.createSheet("first sheet", 0); 

이 통합 문서 객체가 이전에 인스턴스화하고 WritableWorkbook 객체가되었습니다. WritableWorkbook의 수퍼 클래스 인 통합 문서에서 제공하는 정적 메서드를 사용하여 통합 문서를 만들고 있습니다. 그리고이 때까지, 나는 거기에있다. 하지만 두 번째 명령에서 내가 뭘하고 있니? 시트가 "WritableSheet"이지만 인터페이스입니다! 그리고 API를 보면 구현 클래스가 없습니다. "WritableSheet"는 다른 인터페이스의 하위 인터페이스이며 "Sheet"입니다. 두 인터페이스. 하지만 인터페이스에서 객체를 만들 수 없다고 생각했습니다. 그런 다음 createSheet 메서드 (WritableWorkbook에서 제공)를 사용하여 WritableSheet를 만들고있는 것 같습니다. 그런 다음 샘플 코드에서 나는이 도착 :

Label lblNome = new Label(0, 1, "Nome:"); 
sheet.addCell(lblNome); 

문제 없음 첫 번째 줄, 나는 새로운 요소, 라벨 (즉, 텍스트 세포 인)을 생성; 하지만 두 번째? 다시, addCell은 API를 보는 인터페이스 메소드입니다! 시트가 이전 구현물 인 동안? 인터페이스의 나에게 보인다. 인터페이스가 추상적 인 방법을 제공한다면 어떤 방법을 사용하고 있습니까?

당신은 나에게 그것을 명확히 것이다? 결국 코드가 작동하지만 인터페이스 (시트 및 WritableSheet)가 어떻게 작동하는지 명확하지 않습니다.

감사합니다.

답변

0

Java의 인터페이스는 계약을 정의하고 있으며 유형입니다! 이 계약에 서명하는 클래스가 여러 개있을 수 있습니다. 이러한 클래스가 인터페이스를 구현하고 있다고합니다.

당신은이 계약의 대상으로 계약을 체결하는 클래스에 의해 생성 된 모든 객체를 볼 수 있습니다. 계약에 캐스팅 될 수 있습니다. 인터페이스를 구현하는 클래스의 객체를이 인터페이스 유형으로 캐스팅 할 수 있습니다.

정적 팩토리 메소드 createSheet()

그런 STH를하고있다. 내부적으로는 WritableSheet을 구현하고 그 객체를 반환하는 구체적인 클래스를 사용합니다. createSheet()의 반환 유형은 WritableSheet이므로 WritableSheet 유형으로 변환됩니다. 우리가 WritableSheet의 객체를 생성하지 않았다는 것을 이해하십시오 - 인터페이스이기 때문에 그렇게 할 수 없습니다. 그러나 우리는 할 수 유형 WritableSheet에 대한 인터페이스를 구현하는 모든 클래스의 객체 캐스팅.

하나의 큰 장점은 createSheet()에 의해 내부적으로 사용되는 구현을 사용하는 클라이언트 코드에 영향을주지 않고 자동으로 변경 될 수 있다는 점이다. createSheet()WritableSheet을 구현하는 다른 구현으로 전환하면 클라이언트 코드에서 아무 것도 변경할 필요가 없습니다!

코드는 인터페이스가 아니라 구체적인 구현에 의해 정의 된 계약에 의존합니다. 그리고 그게 좋은거야!

+0

감사합니다! 매우 명확한! –

1

모든 개체는 구체적인 클래스의 인스턴스입니다. 어쩌면 javadoc에 구현 클래스가 표시되지 않을 수도 있습니다.아마도 다음과 같이 createSheet에 의해 반환되는 익명 또는 개인 클래스 인스턴스 일 것입니다.

public WritableSheet createSheet() { 
    return new WritableSheetImpl(...); 
} 

private class WritableSheetImpl implements WritableSheet { 
    // implementation of all the methods of WritableSheet here 
} 
+0

+1 일부 코드의 가치는 1,000 단어입니다. :) –

+0

나는이 방법으로 캐스팅 된 객체를 반환 할 수있는 메소드를 깨닫지 못했습니다. 매우 감사합니다. thanks –

+0

이 코드에는 캐스트가 전혀 없습니다. –

관련 문제