Перейти к содержанию

🗒 Задача

В логике мобильной игры есть грузовые и легковые автомобили с такими параметрами:

  • грузовые машины могут перевозить одного пассажира и 2 тонны груза;

  • легковые не перевозят груз, но могут вместить до 3 пассажиров.

Создай интерфейсы, обеспечивающие передвижение машин, перевозку пассажиров и перевозку грузов.

  • учитывай максимальное и текущее количество перевозимых людей или грузов;

  • интерфейсы должны содержать методы загрузки и разгрузки пассажиров или грузов.

Спроектируй классы и несколько объектов. Вызови их методы, «перевезя» таким образом 6 человек и 2 тонны груза.

❌ Ошибки

✏️ Комментарии

Смотри, тут немного логический рассинхрон получается. В задаче сказано перевезти определенное количество людей. В коде объекты создаются с конкретным количеством человек. Но корректнее эти объекты должны иметь поля с "максимально возможным количеством мест для перевозки". А вот непосредственное количество перевозимых людей (и грузов) будет храниться в отдельном поле и подставляться при инициализации объекта.
Я бы переделал реализацию с применением `forEachIndexed`
Множество отдельно объявленых переменных-счетчиков довольно сильно нагружают читаемость кода
В новой реализации индекс не требуется) и теперь уже можно было бы использовать просто forEach
Интерфейс Transporting отвечает за два разных действия: перевозку груза и перевозку пассажиров. лучше разделить его на два разных интерфейса.
Иначе текущий дизайн нарушает принцип разделения интерфейсов из принципов SOLID. легковые машины не могут перевозить груз, но вынуждены иметь метод cargoTransporting()
Довольно много дублирующего кода в мейне. давай сделаем поэлегантнее. предлагаю создать функцию, которая принимает объект транспортного средства и выводит информацию о нем
Вопросы лучше писать комментарием к Pull Request'у.
То есть Cars, это класс обладающий свойствами и перевозки пассажиров и грузов?
Давай еще раз взглянем на требования:
- Напиши интерфейсы, обеспечивающие передвижение машин, перевозку пассажиров и перевозку грузов.
Итого, нужно три интерфейса, к примеру: `Moveable`, `CargoTransportable`, `PassengerTransportable`. И методы соответственно: `move()`, ` transportCargo()`, ` transportPassengers()`.
А далее распределим эти интерфейсы: Truck у нас может ехать и везти груз. PassengerCar - ехать и везти пассажиров.
Ты почти все сделал в соответствии с условиями, только промежуточный класс Cars не нужен

🧾 Решение

interface Movable {
    fun move()
}

interface PassengerTransportable {
    val maxPassengers: Int
    var currentPassengers: Int
    fun loadPassengers(passengers: Int) {
        currentPassengers = (currentPassengers + passengers).coerceAtMost(maxPassengers)
        println("Загружено $passengers пассажиров. Текущие пассажиры: $currentPassengers")
    }
    fun unloadPassengers(passengers: Int) {
        currentPassengers = (currentPassengers - passengers).coerceAtLeast(0)
        println("Разгружено $passengers пассажиров. Текущие пассажиры: $currentPassengers")
    }
}

interface CargoTransportable {
    val maxCargo: Int
    var currentCargo: Int
    fun loadCargo(weight: Int) {
        currentCargo = (currentCargo + weight).coerceAtMost(maxCargo)
        println("Загружено $weight тонн груза. Текущий груз: $currentCargo тонн")
    }
    fun unloadCargo(weight: Int) {
        currentCargo = (currentCargo - weight).coerceAtLeast(0)
        println("Разгружено $weight тонн груза. Текущий груз: $currentCargo тонн")
    }
}

class Truck : Movable, PassengerTransportable, CargoTransportable {
    override val maxPassengers = 1
    override var currentPassengers = 0
    override val maxCargo = 2
    override var currentCargo = 0

    override fun move() {
        println("Грузовик движется с $currentPassengers пассажиром(ами) и $currentCargo тонн(ами) груза.")
    }
}

class Car : Movable, PassengerTransportable {
    override val maxPassengers = 3
    override var currentPassengers = 0

    override fun move() {
        println("Легковая машина движется с $currentPassengers пассажиром(ами).")
    }
}

fun main() {
    val truck = Truck()
    val car1 = Car()
    val car2 = Car()

    truck.loadPassengers(1)
    truck.loadCargo(2)

    car1.loadPassengers(3)
    car2.loadPassengers(2)

    truck.move()
    car1.move()
    car2.move()

    truck.unloadPassengers(1)
    truck.unloadCargo(2)

    car1.unloadPassengers(3)
    car2.unloadPassengers(2)
}