#java #interface
#java #интерфейс
Вопрос:
Я пытаюсь написать программу моделирования вождения, и мне нужна помощь в разработке. У меня есть интерфейс под названием RoadObjects, который на данный момент содержит транспортные средства и млекопитающих. Мне нужно реализовать различные типы автомобилей, такие как грузовики, седаны, полуприцепы. у них есть некоторые общие и некоторые уникальные методы. Позже я добавлю другие виды транспортных средств и млекопитающих. Я не хочу использовать наследование, и я пытаюсь сделать это в соответствии с принципами проектирования и шаблонами, такими как принцип open-closed и factory. Теперь мой вопрос в том, должен ли я спроектировать его так:
RoadObject interface
Vehicle extends RoadObject
Mammal extends RoadObject
SedanImpl implements Vehicle
TruckImpl implements Vehicle
People implements Mammal
…
…
или я должен просто не иметь интерфейса vehicle и people и делать это?
RoadObject interface
SedanImpl implements RoadObject
TruckImpl implements RoadObject
People implements RoadObject
Новый вопрос:
Я хочу использовать фабричный шаблон, чтобы выбрать, например, какие транспортные средства. Итак, я создаю VechicleImpl и VechicleImplFactory, чтобы это могло выглядеть так:
RoadObject interface
Vehicle extends RoadObject
VehicleImpl implements Vehicle
Mammal extends RoadObject
SedanImpl implements Vehicle
TruckImpl implements Vehicle
People implements Mammal
Это плохой дизайн? Потому что VehicleImpl будет иметь много повторяющихся методов SedanImpl, TruckImpl и т. Д. Или, если бы я хотел иметь фабрику, которая создает транспортное средство, где это должно быть?
Комментарии:
1. Моделирование дополнительных классов для
Truck
иSedan
может вообще не потребоваться, поэтому наличие одногоVehicleImpl
может удовлетворить все ваши требования, если вы можете сопоставить информацию, необходимую дляTruck
иSedan
для вашегоVehicleImpl
.2. @home, но есть проблема с методами, которые уникальны для грузовиков и седанов
3. @Home
... they have some methods in common and some unique.
выглядит так, как будто он уже сделал.4. @Dan В своем вопросе вы упомянули, что «не хотите использовать наследование» и что вы хотите использовать принцип open-closed … Принцип открытия-закрытия зависит от наследования «закрыт для модификации, открыт для расширения». Как вы планируете это осуществить? Кроме того, вы уже используете наследование, которое появляется.
5. @Matthew Cox: OP спросил, являются ли повторяющиеся методы в
VehcileImpl
и соответствующие им подклассы плохим дизайном, поэтому я хотел понять, как выглядят дубликаты. В общем, специализация на разных типах автомобилей не имеет смысла, есть лучшие способы спроектировать это — например, список функций вVehicleImpl
. Это то, что я хотел понять.
Ответ №1:
Оба подхода действительны, нужна ли вам явная абстракция для транспортных средств, зависит от ваших требований. SedanImpl
И TruckImpl
т. Д. Могут иметь некоторые функции, общие для транспортных средств, но не для людей / животных:
public interface Vehcile extends RoadObject
getTires()
getEngine()
Поскольку вы отметили это в Java, общие abstract
классы также могут быть полезны:
public abstract class AbstractVehicle implements Vehicle {
private Integer tires = 4;
public Integer getTires() { return this.tires; }
/* ... */
}
Так что TruckImpl
это может наследовать от AbstractVehicle
:
public class TruckImpl extends AbstractVehicle {
/* ... */
}
Ответ №2:
Что-то разумное:
- public interface IRoadObject
- public class People implements IRoadObject
- public class Vehicle
- public class Truck extends Vehicle implements IRoadObject
- public class Sedan extends Vehicle implements IRoadObject
Тем не менее, это все еще зависит от требований. Без четких требований, как у вас, я думаю, это достаточно просто.
Ответ №3:
Я думаю, что vehicle amp; people — хорошая идея. Я бы использовал для этого абстрактные классы.
Также подумайте о поведении. Поведение школьного автобуса несколько отличается от поведения мотоцикла, и вы можете реализовать это с помощью интерфейсов.
Посмотрите здесь, чтобы найти еще несколько идей.