🗒 Задача¶
В логике мобильной игры есть грузовые и легковые автомобили с такими параметрами:
-
грузовые машины могут перевозить одного пассажира и 2 тонны груза;
-
легковые не перевозят груз, но могут вместить до 3 пассажиров.
Создай интерфейсы, обеспечивающие передвижение машин, перевозку пассажиров и перевозку грузов.
-
учитывай максимальное и текущее количество перевозимых людей или грузов;
-
интерфейсы должны содержать методы загрузки и разгрузки пассажиров или грузов.
Спроектируй классы и несколько объектов. Вызови их методы, «перевезя» таким образом 6 человек и 2 тонны груза.
❌ Ошибки¶
✏️ Комментарии¶
Смотри, тут немного логический рассинхрон получается. В задаче сказано перевезти определенное количество людей. В коде объекты создаются с конкретным количеством человек. Но корректнее эти объекты должны иметь поля с "максимально возможным количеством мест для перевозки". А вот непосредственное количество перевозимых людей (и грузов) будет храниться в отдельном поле и подставляться при инициализации объекта.
Интерфейс Transporting отвечает за два разных действия: перевозку груза и перевозку пассажиров. лучше разделить его на два разных интерфейса.
Иначе текущий дизайн нарушает принцип разделения интерфейсов из принципов SOLID. легковые машины не могут перевозить груз, но вынуждены иметь метод cargoTransporting()
Довольно много дублирующего кода в мейне. давай сделаем поэлегантнее. предлагаю создать функцию, которая принимает объект транспортного средства и выводит информацию о нем
Давай еще раз взглянем на требования:
- Напиши интерфейсы, обеспечивающие передвижение машин, перевозку пассажиров и перевозку грузов.
Итого, нужно три интерфейса, к примеру: `Moveable`, `CargoTransportable`, `PassengerTransportable`. И методы соответственно: `move()`, ` transportCargo()`, ` transportPassengers()`.
А далее распределим эти интерфейсы: Truck у нас может ехать и везти груз. PassengerCar - ехать и везти пассажиров.
🧾 Решение¶
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)
}