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

🗒 Задача

Скопируй классы из предыдущей задачи и измени их названия для избегания конфликтов.

Каждый тип корабля обладает уникальным способом погрузки:

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

  • грузовой корабль активирует погрузочный кран;

  • ледокол открывает ворота со стороны кормы.

Реализуй методы погрузки, специфичные для каждого вида корабля.

Добавь метод вывода информации о свойствах корабля и выведи информацию в консоль.

❌ Ошибки

  • проблемы с неймингом функций

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

Напоминаю, функции как правило означают какие-то действия, согласно конвенции стиля Котлин их принято именовать в инфинитиве. То есть “сделать что-то”. Если это запрос некой информации, то можно в начало добавлять 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()
}