Коллекция абстрактного класса (или что-то в этом роде…)

Сценарий

Я делаю программу на Java, в которой используются автомобили.

ПРИМЕЧАНИЕ: Я упростил этот сценарий (в меру своих возможностей), чтобы сделать его более общим и легким для понимания. . На самом деле я не работаю с автомобилями.

Я создал класс Cars , который представляет собой набор объектов Car .

Car obj ect имеет скорость (двойной) и год (int). Конструктор принимает в качестве параметра год, например:

public class Car {
    private int year;
    private double speed;

    public Car(int year) {
        this.year = year;
    }
}

Вот сложная часть ... Автомобиль должен иметь вид (скажем, Corvette или Clunker). Корвет будет иметь скорость 0,9 , а драндулет будет иметь скорость 0,1 . Автомобиль никогда не может быть создан без указания типа автомобиля. Итак, теперь, чтобы создать автомобиль, у нас есть:

Car car = new Car(1998, Corvette);

Corvette, который мы только что создали, будет объектом Car со скоростью 0,9 .

Проблема

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

Возможные решения

  1. Я мог бы работать с подклассами, то есть иметь абстрактный класс Автомобиль , который расширен Corvette и Clunker , но тогда У меня проблема с использованием объекта Cars (потому что я не могу создать коллекцию чего-то, что не может быть создано). См. ИЗМЕНИТЬ ниже.

  2. Использование перечисления (например, CarKind ), по-видимому, требует нескольких беспорядочных операторов switch:

    • для заполнения поля speed каждого автомобиля
    • для создания Car объекты из класса Cars
    • и т. Д.

Чем вы можете помочь

Я ищу решение, которое позволяет одному классу Cars содержать каждый объект Car . Мне не нужны разные коллекции (например, Corvettes , Clunkers ).Я также ищу решение, которое позволяет создавать объекты Car на основе атрибутов отдельного типа автомобиля ... как упоминалось ранее, создавая новый Car своего рода Корвет даст скорость 0,9 . Не должно быть другого способа указать скорость автомобиля .

Есть ли лучший способ в этой ситуации? Достаточно ли я прояснил этот пример?

Спасибо.

РЕДАКТИРОВАТЬ: Причина, по которой мне не нужна коллекция абстрактных объектов Car , заключается в том, что цель коллекции Cars состоит в создании и управлении Car предметы, независимо от их вида. Автомобиль , будучи абстрактным, кажется, усложняет это. Если вы считаете, что это лучшее решение, ответьте соответственно.

7
задан Peter 15 July 2012 в 23:42
поделиться