jxl api: почему writablesheet - это интерфейс? - PullRequest
1 голос
/ 12 января 2012

Я довольно новичок в Java и застрял с этим, пожалуйста.Ну, я знаю, что интерфейс «предоставляет» только абстрактные методы, которые будут реализованы конкретными подклассами.Надеюсь, что это правда (по крайней мере).Поэтому я изучал пример кода jxl api для написания и чтения файла Excel и пришел к следующему пункту:

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

То есть объект книги ранее был создан и является объектом WritableWorkbook.Я создаю книгу, используя статический метод, предоставляемый Workbook, который является суперклассом WritableWorkbook.И до этого я там.Но тогда, что я делаю во второй инструкции?Лист представляет собой «WritableSheet», но это интерфейс!И, видя API, нет классов реализации.И «WritableSheet» является подынтерфейсом другого интерфейса, который называется «Sheet».Оба интерфейса.Но я думал, что не смогу создать объект из интерфейса.Тогда, используя метод createSheet (предоставляемый WritableWorkbook), кажется, я создаю WritableSheet.Затем в примере кода я прихожу к этому:

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

Нет проблем, первая строка, я создаю новый элемент, метку (это текстовая ячейка);а второй?Опять же, addCell - это метод интерфейса, который видит API!в то время как лист был предыдущая реализация чего?Из интерфейса мне кажется.И какой метод они используют, если интерфейсы предоставляют абстрактный метод?

Пожалуйста, объясните мне это?В конце код работает, но не ясно, как работают эти интерфейсы (Sheet и WritableSheet).

Спасибо

Ответы [ 2 ]

1 голос
/ 12 января 2012

Все объекты являются экземплярами конкретных классов. Может быть, вы не видите реализующий класс в Javadoc, но есть один. Вероятно, это экземпляр анонимного или частного класса, который возвращается createSheet, например:

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

private class WritableSheetImpl implements WritableSheet {
    // implementation of all the methods of WritableSheet here
}
0 голосов
/ 12 января 2012

Интерфейсы в Java определяют контракт, и они являются типами! Может быть несколько классов, подписывающих этот контракт - мы говорим, что эти классы реализуют интерфейс.

Вы можете видеть любой объект, созданный классом, подписавшим контракт, как объект этого контракта. Он может быть приведен к контракту - мы говорим, что вы можете привести любой объект из класса, реализующего интерфейс к этому типу интерфейса.

Статический фабричный метод createSheet() делает что-то подобное. Он внутренне использует конкретный класс, который реализует WritableSheet и возвращает его объект. Поскольку createSheet() возвращает тип WritableSheet, он приводится к типу WritableSheet. Обязательно поймите, что мы не создали объект WritableSheet - мы не можем, так как это интерфейс. Но мы можем привести объект любого класса, реализующий интерфейс к типу WritableSheet.

Одним из основных преимуществ является то, что реализация, используемая внутри createSheet(), может быть изменена автоматически, не затрагивая клиентский код, который ее использует. Когда createSheet() переключается на другую реализацию, которая реализует WritableSheet, вам не нужно ничего менять в своем клиентском коде!

Ваш код опирается на контракт, определенный интерфейсом, а не на конкретную реализацию. И это хорошо!

...