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

🗒 Задача

В компьютерной игре есть три типа кораблей: лайнер, грузовой и ледокол. Все корабли основаны на базовом классе лайнера, но каждый из них имеет свой функционал и дополнительные свойства.

  • У грузовых кораблей скорость меньше, но грузоподъемность больше.

  • У ледоколов ниже и скорость, и вместительность, но они могут колоть лёд.

  • Лайнеры могут вмещать наибольшее количество пассажиров.

Спроектируй иерархию классов, задав значения по умолчанию в конструкторе базового класса. Отнаследованные классы должны переопределять необходимые свойства. Создай по одному экземпляру каждого типа корабля.

❌ Ошибки

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

Как правило для запроса какой-то информации в названии используется "get". Поэтому тут подойдет что-то вроде `getCapacity()` / `getShipSpeedInfo()`
Тут из-за неочевидного нейминга можно запутаться. Эта функция получает информацию о возможностях этого типа корабля или вызывает метод программы, который запускает у объекта действие "колоть лед"? Предлагаю назвать в инфинитиве и конкретизировать действие.
В том виде, в котором построена иерархия у тебя, Cargo и Iceship - избыточные классы, потому как параметры ты передаешь через их конструкторы. Тогда уж можно везде использовать Liner.
Нужно чтобы Liner - был обобщенным типом (у тебя так и есть), а отнаследованные классы кораблей переопределяли свойства родителя. То есть чтобы, к примеру, для создания ледокола достаточно было:

`val iceShip = Iceship("iceShip1")`

🧾 Решение

open class Liner(
    open val name: String,
    open val speed: Int = 20,
    open val passengerCapacity: Int = 1000,
    open val cargoCapacity: Int = 0
)

class CargoShip(
    override val name: String
) : Liner(
    name = name,
    speed = 15,
    passengerCapacity = 500,
    cargoCapacity = 5000
)

class Icebreaker(
    override val name: String
) : Liner(
    name = name,
    speed = 10,
    passengerCapacity = 300,
    cargoCapacity = 300
)

fun main() {
    val liner = Liner("Океанский лайнер")
    println("${liner.name}: Скорость: ${liner.speed}, Вместимость пассажиров: ${liner.passengerCapacity}, Грузоподъемность: ${liner.cargoCapacity}т")

    val cargo = CargoShip("Тяжеловоз")
    println("${cargo.name}: Скорость: ${cargo.speed}, Вместимость пассажиров: ${cargo.passengerCapacity}, Грузоподъемность: ${cargo.cargoCapacity}т")

    val icebreaker = Icebreaker("Арктика")
    println("${icebreaker.name}: Скорость: ${icebreaker.speed}, Вместимость пассажиров: ${icebreaker.passengerCapacity}, Грузоподъемность: ${icebreaker.cargoCapacity}т")
}