2012-01-12 2 views
1

私はJavaにはかなり新しく、このままで立ち往生してください。 私は、具体的なサブクラスによって実装される抽象メソッドのみを '提供する'ことを知っています。これが本当であることを望みます(少なくとも)。 は、だから私は、Excelファイルを読み書きするために、JXL APIのサンプルコードを勉強していました、そして私は、この点に着い:jxl api:なぜwritablesheetはインターフェイスですか?

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

、ワークブックオブジェクトが以前にインスタンス化され、WritableWorkbookオブジェクトでたされていること。 私は、WorkbookがWritableWorkbookのスーパークラスである静的メソッドを使用してブックを作成しています。それまでは、私はそこにいます。 しかし、次に、私は第2の命令で何をしていますか? シートは「WritableSheet」ですが、これはインターフェイスです!そしてAPIを見ると、実装クラスはありません。また、 "WritableSheet"は別のインターフェースのサブインターフェースであり、 "Sheet"です。両方のインターフェイス。しかし、私はインターフェイスからオブジェクトを作成できないと思った。一方、createSheetメソッド(WritableWorkbookで提供)を使用している間は、WritableSheetを作成しているようです。 次にサンプルコードでIはこれに到着:

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

問題なし最初の行は、私は新しい要素、ラベル(すなわちテキスト細胞である)を作成します。 しかし、第2?再度、addCellはAPIを見ているインターフェイスメソッドです! シートは以前の実装のどれですか?インターフェイスの私に思われる。 インタフェースが抽象メソッドを提供する場合、どのメソッドを使用していますか?

私にそれを明確にしてください。最後にコードは機能しますが、これらのインターフェイス(SheetとWritableSheet)がどのように機能しているかははっきりしていません。

ありがとう

答えて

0

Javaのインタフェースは契約を定義しており、それらはタイプです!この契約に署名するいくつかのクラスが存在する可能性があります。これらのクラスはインターフェイスを実装しています。

この契約のオブジェクトとして契約書に署名したクラスによって作成されたオブジェクトをすべて見ることができます。これは契約にキャストすることができます。インタフェースを実装するクラスのオブジェクトをこのインタフェースの型にキャストすることができます。

静的ファクトリメソッドcreateSheet()は、そのようにしています。内部的にはWritableSheetを実装しているオブジェクトを返す具象クラスを使用しています。 createSheet()の返品タイプはWritableSheetなので、タイプWritableSheetにキャストされます。 WritableSheetのオブジェクトを作成していないことを理解してください。インターフェイスなので、できません。しかし、私たちはキャストタイプWritableSheetへのインターフェイスを実装するクラスのオブジェクトをキャストできます。

大きな利点の1つは、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いくつかのコードは1000語に相当します。 :) –

+0

私は決してメソッドがキャストされたオブジェクトをその方法で返すことができないことを知りました:)ありがとう –

+0

このコードにはキャストは全くありません。 –

関連する問題