web-dev-qa-db-ja.com

インターフェイスを初期化していますか?

私が抱えている現在の問題では( Javaで物理プリンターにファイルを印刷する )使用されている各クラスのjavadocから有用な欠落情報をむさぼり食う狂人のようにコードを実行しています。

さて、私は以前の質問からこのコードのかなりの部分を引き出したので、自分で書かなかったかなりの部分がありました。私が気付いた問題は、私がつかんだコードがオブジェクトを初期化することです。たとえば、インターフェイス(Doc)を実装する「SimpleDoc」と言って、それをそのインターフェイスに割り当てますか?!

リトルコードスニペット:

Doc mydoc = new SimpleDoc(textStream, flavor, null);

Javaでオブジェクトを作成することを理解するように導かれた限り、私は継承に精通しており、クラスが「継承」できるようにインターフェイスを使用するトリックに精通しています。複数のスーパークラス。

しかし、これは正しく固執していません。インターフェイスを実装するクラスを作成できます。これは私にとっては問題ありません。しかし、インターフェイスが作成され、オブジェクトがそのインターフェイスに縮小されると、ここで何が起こっているのでしょうか。 mydocを正確に参照すると、何にアクセスできますか?

9
Alex

秘訣は、インターフェースを「作成」、「インスタンス化」、または「初期化」していないことを認識することです。変数を、そのインターフェイスを実装していることがわかっているものとして定義しているだけです。

基本的に、このコードに取り組んでいる他のプログラマーに、このメソッドの残りの部分では、myDocDoc(つまり、Doc interface)。これにより、IDEのオートコンプリートにより、SimpleDocが実行できるすべてのものではなく、このインターフェイスによって定義されたメソッドのみが表示されるため、プログラミングが簡単になります。

将来、機能を拡張して、入力に応じてDocの実装を変えることができると想像してみてください。 SimpleDocを明示的に作成するのではなく、次のように言います。

Doc mydoc = docFactory.getByType(inputType);

docFactoryは任意のタイプのDocを生成できます。このメソッドは、どの種類がインスタンス化されるかを実際には気にしません。これは、それをDocのように扱うためです。

7

インターフェイスを作成することはできません。ここで行うことは、インターフェイスmydocを実装するクラスSimpleDocのオブジェクトDocを作成することです。クラスはこのインターフェースを実装しているため、mydocをそのインターフェースのインスタンスであるかのように処理できます。これにより、クラスSimpleDocに実装されているインターフェイスで宣言されたすべてのメソッドにアクセスできます。

たとえば、Doc-Interfaceが次のようになっている場合:

_public interface Doc {
    void print();
}
_

simpleDocクラスは次のようになります。

_public class SimpleDoc implements Doc {

    public void clear() { ... }

    @Override
    public void print() { ... }

}
_

...その場合、アクセスできるのはprint()-メソッドmydoc-オブジェクトのみです。しかし、あなたはまた言うことができます:

_SimpleDoc mydoc = new SimpleDoc();
_

...そして、clear()を呼び出すこともできます

6
Eike Cochu