2

Все,Что лучше? Понижающее приведение? Интерфейс? Абстрактный класс?

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

1 примечание. Я использую Google AppEngine и Datastore для хранения этой информации.

Хорошо ... Позволяет сказать, что у меня есть Super Class of Vehicle, у которого есть 3 подкласса ... Автомобиль, Грузовик, Мотоцикл.

В супер класса, есть 3 свойства ... Производитель, Модель, Тип

Например, это может быть:

  • Производитель: Ford
  • Модель: Focus
  • Тип: Автомобиль

Так что в Хранилище данных у меня есть многочисленные объекты транспортных средств с этими свойствами. Итак, если пользователь хочет увидеть все автомобили ... Я тяну каждый из них с типом «Автомобиль».

Если пользователь затем хочет добавить один из этих Транспортных средств в список «Избранное», я затем преобразую объект Vehicle в его конкретный подкласс, основываясь на его типе. Затем добавляются дополнительные свойства этого конкретного подкласса.

Этот новый дочерний объект хранится в хранилище данных с его добавленными свойствами.

Так что, в основном, я удручаю, например, от транспортного средства до автомобиля. Я сделал это, создав дополнительный constuctor в классе Car, который берет автомобиль в качестве аргумента. После создания объект «Автомобиль» теперь имеет все свойства (Производитель, Модель, Тип) и все новые свойства, которые поставляются с его конкретной реализацией.

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

Основная причина, по которой я выбрал этот путь, - это то, как работает хранилище данных GAE. Его «дешевле» хранить Суперкласс и его ограниченные свойства и запрашивать их. Длинная история.

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

Спасибо за помощь.

ответ

0

Я не думаю, что вам нужна структура супер/подкласс. В описанной вами проблеме вы «меняете» объект от одного типа к другому, и вы не можете изменить тип объекта Java. Вы можете создать новый объект, но тогда вам нужно переместить всю свою информацию из одной в другую, а обслуживание станет проблемой.

Я предлагаю вам иметь класс, который представляет ваш автомобиль, и что он содержит ссылку на информацию, относящуюся к типу; классы, представляющие каждый конкретный тип, могут все расширять что-то и, вероятно, должны так, чтобы методы внутри транспортного средства, пытающиеся что-то сделать с типом, могли вызвать общий метод, чтобы сделать это независимо от типа. Но таким образом, как только вы решите конкретный тип, вы можете добавить его к существующему объекту транспортного средства, а не «изменить» его.

Вы также можете исследовать, будет ли перечисляемый тип служить вашей цели для конкретных типов данных - типы перечислений могут принимать конструкторы, иметь дополнительные методы и т. Д. - учебник по Oracle/Java по перечислениям охватывает это довольно хорошо.

0

Тип транспортного средства кодируется дважды: один раз как тип объекта и один раз в качестве свойства. Избавьтесь от одного из них, чтобы не было возможности иметь «Грузовик» (тип объекта) со значением свойства, установленным в «Автомобиль». Храните свою структуру объекта или свойство, указывающее на тип транспортного средства (я рекомендую использовать Enum), но не оба.

Чтобы сбрасывать, вам не нужно создавать новый объект дочернего типа. Just downcast:

Car myCar = (vehicle instanceof Car ? (Car)vehicle : null); 
Смежные вопросы