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

🗒 Задача

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

Если посылка прямоугольная, она должна создаваться с длиной, шириной и высотой. Если посылка – куб, то только с длиной ребра.

❌ Ошибки

  • используют неверную формулу для расчета площади прямоугольника

  • для куба умножают на 2, а не возводят в степень

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

Почему тут свойство “глубина”, если в ТЗ третье свойство высота?
Произведение длины, ширины и глубины вычисляет объем, а не площадь. Нужно использовать другую формулу.
Для вычисления площади куба надо возводить в степень 2, а не умножать на 2.
Приведение к строке toString() тут излишнее действие. Принт под капотом принимает тип Any и из любого объекта достает строковое значение.
Все ок, но создавай объект с указанием типа Package (чтобы проверить, что полиморфизм работает)
Можно сделать более элегантно, не проставляя значений по умолчанию в базовом классе. Либо вообще отказаться от свойств в родителе. 
Почему бы тут не упростить формулу: внутри скобок складывать и перемножать, а потом все умножать на 2

🧾 Решение

open class Parcel {
    open fun calculateSurfaceArea(): Double {
        return 0.0
    }
}

class RectangularParcel(
    private val length: Double,
    private val width: Double,
    private val height: Double
) : Parcel() {
    override fun calculateSurfaceArea(): Double {
        return 2 * (length * width + length * height + width * height)
    }
}

class CubicParcel(sideLength: Double) : RectangularParcel(sideLength, sideLength, sideLength)

fun main() {
    val rectangularParcel = RectangularParcel(10.0, 5.0, 3.0)
    val cubicParcel = CubicParcel(7.0)

    println("Площадь поверхности прямоугольной посылки: ${rectangularParcel.calculateSurfaceArea()}")
    println("Площадь поверхности кубической посылки: ${cubicParcel.calculateSurfaceArea()}")
}