🗒 Задача¶
Скопируй классы из предыдущей задачи и измени их названия для избегания конфликтов.
Каждый тип корабля обладает уникальным способом погрузки:
-
лайнер выдвигает горизонтальный трап со шкафута;
-
грузовой корабль активирует погрузочный кран;
-
ледокол открывает ворота со стороны кормы.
Реализуй методы погрузки, специфичные для каждого вида корабля.
Добавь метод вывода информации о свойствах корабля и выведи информацию в консоль.
❌ Ошибки¶
- проблемы с неймингом функций
✏️ Комментарии¶
Напоминаю, функции как правило означают какие-то действия, согласно конвенции стиля Котлин их принято именовать в инфинитиве. То есть “сделать что-то”. Если это запрос некой информации, то можно в начало добавлять get… Но всегда это должен быть глагол.
В целом, корректный способ, ограничиться одним методом, но давай создадим перегруженную версию указанного метода для каждого подкласса.
Потому как, println - это лишь эмуляция поведения, а представим, что осуществляется какие-то дополнительные системыные вызовы, разные в каждом случае корабля
Да, все верно.
Можешь представить теперь, что в твоей игре есть класс `Harbor{}` (порт), который вызывает методы loadCargo() для списка кораблей, при этом в списке могут быть все типы и подтипы Ship.
🧾 Решение¶
open class UpdatedLiner(
open val name: String,
open val speed: Int,
open val passengerCapacity: Int,
open val cargoCapacity: Int
) {
open fun load() {
println("Лайнер выдвигает горизонтальный трап со шкафута.")
}
fun displayInfo() {
println("$name: Скорость: $speed, Вместимость пассажиров: $passengerCapacity, Грузоподъемность: ${cargoCapacity}т")
}
}
class UpdatedCargoShip(
override val name: String,
override val speed: Int = 15,
override val passengerCapacity: Int = 500,
override val cargoCapacity: Int = 5000
) : UpdatedLiner(name, speed, passengerCapacity, cargoCapacity) {
override fun load() {
println("Грузовой корабль активирует погрузочный кран.")
}
}
class UpdatedIcebreaker(
override val name: String,
override val speed: Int = 10,
override val passengerCapacity: Int = 300,
override val cargoCapacity: Int = 300
) : UpdatedLiner(name, speed, passengerCapacity, cargoCapacity) {
override fun load() {
println("Ледокол открывает ворота со стороны кормы.")
}
}
fun main() {
val liner = UpdatedLiner("Новый лайнер", 25, 1000, 0)
liner.displayInfo()
liner.load()
val cargo = UpdatedCargoShip("СуперТяжеловоз")
cargo.displayInfo()
cargo.load()
val icebreaker = UpdatedIcebreaker("Новая Арктика")
icebreaker.displayInfo()
icebreaker.load()
}