Инициализация интерфейса? - PullRequest
9 голосов
/ 13 января 2012

В текущей проблеме у меня ( печать файла на физическом принтере в Java ) я бегал по коду, как сумасшедший, пытающийся пожрать любую полезную пропущенную информацию из javadoc каждого класса используемый.

Теперь, я извлек довольно много этого кода из предыдущих вопросов, так что было немало того, что я сам не написал. Проблема, которую я заметил, заключается в том, что код, который я взял, инициализирует объект, скажем «SimpleDoc», который реализует интерфейс (Doc), и назначает его этому интерфейсу ?!

Маленький фрагмент кода:

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

Теперь, насколько я понял в Java, мы создаем объекты. Я знаком с наследованием и знаком с уловкой использования интерфейсов, позволяющих классу «наследовать» несколько суперклассов.

Но это не правильно. Вы можете создать класс, который реализует интерфейс, что меня устраивает. Но что здесь происходит, когда создается интерфейс и объект сводится к его интерфейсу? Что я получаю, когда точно ссылаюсь на mydoc?

Ответы [ 2 ]

6 голосов
/ 13 января 2012

Хитрость заключается в том, чтобы понять, что вы не «создаете», «создаете экземпляр» или «инициализируете» интерфейс. Вы просто определяете переменную как нечто, что, как вы знаете, реализует этот интерфейс.

Вы, по сути, говорите другим программистам, работающим над этим кодом, что для остальной части этого метода вас интересует только тот факт, что myDoc - это Doc (то есть то, что удовлетворяет интерфейсу Doc). Это может упростить программирование, потому что автозаполнение в IDE теперь будет показывать только методы, определенные этим интерфейсом, а не все, на что способен SimpleDoc.

Представьте себе, что в будущем вы захотите расширить свои функциональные возможности, чтобы у вас могли быть разные реализации Doc в зависимости от некоторого ввода. Вместо явного создания SimpleDoc вы говорите:

Doc mydoc = docFactory.getByType(inputType);

docFactory может производить любой тип Doc, и этот метод на самом деле не заботится о том, какой тип создается, потому что он будет обрабатывать его как Doc независимо.

5 голосов
/ 13 января 2012

Вы не можете создавать интерфейсы, здесь вы создаете объект mydoc класса SimpleDoc, который реализует интерфейс Doc.Поскольку класс реализует этот интерфейс, вам разрешено обрабатывать mydoc, как если бы он был экземпляром этого интерфейса.Это позволяет вам получить доступ ко всем объявленным методам в интерфейсе, которые реализованы в классе SimpleDoc

Если, например, ваш Doc-интерфейс будет выглядеть так:и ваш класс SimpleDoc будет выглядеть так:

public class SimpleDoc implements Doc {

    public void clear() { ... }

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

}

... тогда вы сможете получить доступ только к print() -методу вашего mydoc -объекта.Но вы также можете сказать:

SimpleDoc mydoc = new SimpleDoc();

... и тогда вы также сможете позвонить clear()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...