Какую структуру данных я должен использовать для хранения объектов разных типов - PullRequest
0 голосов
/ 30 ноября 2011

Я хочу создать простое приложение для книжного магазина. В продаже есть несколько типов вещей: книги, фильмы и журналы. Я думал о создании одного абстрактного класса с методом toString() и 3 подклассами - книгами, фильмами, журналами (будет больше позже). Затем в программе я хотел оперировать этими объектами и думал, что я сохраню их все в ArrayList<ParentClass>. Это хороший выбор структуры данных?

Ответы [ 5 ]

1 голос
/ 30 ноября 2011

Во-первых, я бы порекомендовал вам использовать дженерики.Например, если вы собираетесь определить абстрактный класс (или, возможно, лучший интерфейс Item), создайте new ArrayList<Item>, чтобы вы не смогли добавить туда ничего, кроме Item.

Во-вторых, используйте интерфейс.Ваше определение должно выглядеть следующим образом:

List<? extends Item> lll = new ArrayList<Item>();

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

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

0 голосов
/ 01 декабря 2011

Если вы хотите пойти по пути абстрактного класса, я бы рекомендовал установить общие свойства. Например, поскольку вы используете пример книжного магазина, я уверен, что у всего есть цена. Возможно, есть и другие вещи, которые вы можете связать с этим. Это избавит вас от переопределения простых вещей снова и снова в ваших подклассах.

abstract class BookstoreEntity {
    protected double price;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

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

interface BookstoreEntity {

    public double getPrice();

    public void setPrice(double price);

    //more methods here.
}

Я бы также порекомендовал вам создать класс BookStore или ProductManager или что-то в этом роде, которое определяет действия вашей программы в целом. Он может содержать нативную структуру данных, которая хорошо ее представляет (возможно, Map<int, BookStoreEntity>, где int - идентификатор продукта). Я рекомендую вам не делить подкласс структуры данных в этом случае.

0 голосов
/ 30 ноября 2011

Видимо, ваша проблема не в методе доступа к элементу. Таким образом, любой тип контейнера (Список, Карта, Вектор и т. Д.) Может удовлетворить ваши потребности доступа. Я полагаю, что более четкое и исчерпывающее изложение проблемы заключается в том, что если общий подход к объектам применяется в контексте объектно-ориентированной парадигмы.

Однако объекты любого класса могут быть собраны в любом универсальном контейнере без какой-либо абстракции (через наследование, интерфейсы или абстрактные классы), поскольку все классы расширяют класс Object по умолчанию. Если какой-либо общий режим, такой как выполнение одной и той же операции над каждым элементом, не требуется, как следует из названия вопроса, он также может использоваться: ArrayList<Object> bookStore.

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

0 голосов
/ 30 ноября 2011

Вы можете создать что-то вроде BookstoreEntity абстрактного суперкласса (или интерфейса) с общими характеристиками элементов, над которыми вы хотите работать.Например, color, material, price и т. Д. Вы можете определить метод установки и получения в абстрактном суперклассе.Список BookstoreEntity объектов будет содержать все, что IS-A BookstoreEntity.

Вы можете работать с общими методами (определенными в суперклассе) в цикле for, например (например, getColor, getPrice и т.д ...)

for(BookstoreEntity be: listOfItems) {

  be.getColor();
  be.getPrice();
  //etc...

}

С уважением!

0 голосов
/ 30 ноября 2011

Структура данных в значительной степени зависит от того, что вам нужно делать с данными.Если все, что вы собираетесь сделать, это перебрать все объекты, вызывающие ваш метод toString, то сделайте это.Если вам нужно что-то сделать с вашими данными, для которых ArrayList становится недостаточным, то лучше начать искать другие варианты.

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