Хранить интерфейс в списке массивов Java - PullRequest
4 голосов
/ 14 марта 2010

Я учу Java. Я пытаюсь использовать композитный дизайн шаблона. Я пытаюсь использовать следуя логике (Не смейтесь, я знаю, что это очень просто :))

Item -> interface
Folder -> class
File -> class

Могу ли я создать в классе папок массив Item для хранения информации о файлах?

ArrayList<Item> info = ArrayList<Item>();

Или мне следует использовать Arraylist для папок?

ArrayList<Folder> info = ArrayList<Folder>();

Я не знаю, может ли интерфейс хранить реальные данные, так как нет переменной просто определения функций.

Спасибо за помощь новичку:)

Ответы [ 4 ]

4 голосов
/ 14 марта 2010

Вы можете сделать оба (с некоторой синтаксической коррекцией)

List<Item> info = new ArrayList<Item>();

Что касается этого комментария:

Я не знаю, может ли интерфейс хранить реальные данные, поскольку нет переменной, просто определения функций.

Интерфейсы не только предоставляют определения функций. Наиболее важно, они определяют тип . info, объявленный, как указано выше, представляет собой список объектов типа Item. Эти объекты, безусловно, могут хранить данные.

В качестве примера рассмотрим следующее:

interface Item { ... }
class Folder implements Item { ... }

Item it = new Folder();

Теперь it относится к экземпляру Folder, который является Item.

1 голос
/ 14 марта 2010

Интерфейс не может хранить данные. Интерфейс - это тип, который вы можете использовать в качестве контракта, который будут реализованы вашими классами файлов и папок. Поскольку ваши классы Files и Folder реализуют интерфейс Item, вы можете добавлять файлы и объекты папок в список, который принимает тип Item.

List<Item> info = new ArrayList<Item>()
1 голос
/ 14 марта 2010

Вы, безусловно, можете создать ArrayList элементов. Это не проблема, что Item, как интерфейс, не имеет переменных экземпляра. Однако, единственные Предметы, которые могут быть созданы, не являются «просто» Предметами - они будут экземплярами некоторого класса, implements интерфейса Предмета. Так, например, если Folder и File оба реализуют интерфейс Item, вы можете поместить и папки, и файлы в этот ArrayList. Но ArrayList будет объявлен просто для хранения Предметов - и, поскольку они реализуют этот интерфейс, и Папки, и Файлы соответствуют требованиям - они являются Предметами.

1 голос
/ 14 марта 2010

Пока Folder и File оба реализуют Item, это будет нормально работать. Имейте в виду, однако, что у вас будет доступ только к свойствам, которые определены в интерфейсе Item: не относятся к Folder или File.

Из того, что вы описали, это звучит как разумный способ решения проблемы, хотя трудно сказать наверняка, не зная больше об использовании этой структуры данных.

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