Реализация класса в Java

#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 — хорошая идея. Я бы использовал для этого абстрактные классы.

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

Посмотрите здесь, чтобы найти еще несколько идей.