🗒 Задача¶
В компьютерной игре есть три типа кораблей: лайнер, грузовой и ледокол. Все корабли основаны на базовом классе лайнера, но каждый из них имеет свой функционал и дополнительные свойства.
-
У грузовых кораблей скорость меньше, но грузоподъемность больше.
-
У ледоколов ниже и скорость, и вместительность, но они могут колоть лёд.
-
Лайнеры могут вмещать наибольшее количество пассажиров.
Спроектируй иерархию классов, задав значения по умолчанию в конструкторе базового класса. Отнаследованные классы должны переопределять необходимые свойства. Создай по одному экземпляру каждого типа корабля.
❌ Ошибки¶
✏️ Комментарии¶
Как правило для запроса какой-то информации в названии используется "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}т")
}