1

私はJavaが初めてで、これにこだわっています。インターフェイスは、具体的なサブクラスによって実装される抽象メソッドのみを「提供」することを知っています。これが本当であることを願っています(少なくとも)。それで、jxl api のサンプル コードを調べて、Excel ファイルを読み書きしていたところ、次のようにたどり着きました。

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

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

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

最初の行は問題ありません。新しい要素であるラベル (テキスト セル) を作成します。しかし、2番目の?繰り返しますが、addCell は API を参照するインターフェイス メソッドです。一方、シートは何の以前の実装でしたか? インターフェースのようです。また、インターフェイスが抽象メソッドを提供する場合、どのメソッドを使用していますか?

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

ありがとうございました

4

2 に答える 2

1

すべてのオブジェクトは具象クラスのインスタンスです。javadoc に実装クラスが表示されない場合もありますが、1 つ存在します。によって返されるのはおそらく、次のような匿名またはプライベート クラスのインスタンスですcreateSheet

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

private class WritableSheetImpl implements WritableSheet {
    // implementation of all the methods of WritableSheet here
}
于 2012-01-12T12:35:05.127 に答える
0

Java のインターフェースはコントラクトを定義しており、それらは型です! このコントラクトに署名するクラスがいくつかある場合があります。これらのクラスはインターフェイスを実装していると言えます。

コントラクトに署名したクラスによって作成されたオブジェクトは、このコントラクトのオブジェクトとして表示されます。コントラクトにキャストできます。インターフェイスを実装するクラスから任意のオブジェクトをこのインターフェイス型にキャストできると言います。

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

主な利点の 1 つは、 によって内部的に使用される実装を、createSheet()それを使用するクライアント コードに影響を与えることなく、サイレントに変更できることです。createSheet()を実装する別の実装に切り替える場合WritableSheet、クライアント コードを変更する必要はありません。

コードは、具体的な実装ではなく、インターフェイスによって定義されたコントラクトに依存しています。そしてそれは良いことです!

于 2012-01-12T12:18:26.560 に答える