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

🗒 Задача

Напиши программу для работы с геометрическими фигурами: кругом и прямоугольником. Каждая фигура имеет свой цвет и уникальные параметры:

  • для круга — радиус;

  • для прямоугольника — ширину и высоту.

Создай абстрактный класс Figure с полем color. Внутри определи два абстрактных метода:

  • для вычисления площади;

  • для вычисления периметра.

Добавь классы-наследники для вышеупомянутых типов фигур. Реализуй методы для вычисления площади и периметра в каждом из классов-наследников (формулы можно найти в интернете).

Создай несколько объектов разных цветов (черные и белые) и сохрани в единый список. Выведи в консоль:

  • сумму периметров всех черных фигур;

  • сумму площадей всех белых фигур.

❌ Ошибки

  • не выносят текстовые названия цветов в константы

  • не используют filter() для поиска фигур определенного цвета

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

Согласно ТЗ требуется создать абстрактный класс. И объявить абстрактные методы внутри. Абстрактные – потому, что экземпляр класса не планирует создаваться и методы не имеют реализации по умолчанию. 
Такие имена не стоит использовать. Из контекста не всегда понятно, для чего. Как говорится, код чаще читается чем пишется (и не только тобой), не экономь на символах излишне
Все ок, но напоминаю, что константы именуются в стиле отличном от обычных переменных.
Нет необходимости использовать изменяемый список, так как он не перезаписывается после компиляции
Эта переменная есть [в стандартной библиотеке](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.math/-p-i.html). Предлагаю импортнуть ее, чтобы не создавать свою переменную)
Тут и далее по коду: используются изменяемые списки там, где со списком никаких изменений не происходит. Нужно пересмотреть все такие объявления
Методы класса Figure не должны иметь реализации (см. условие).
Значение цветов предлагаю вынести в константы и переиспользовать
Для выбора фигур определенного цвета предлагаю воспользоваться функцией `filter()`. С фильтром код выглядит опрятнее - это более идиоматический подход к разработке. Он подразумевает использование особенностей и конструкций, характерных для языка
Неплохое решение, можно сделать компактнее при помощи filter{}:
`val filtered = list.filter { it.color == color }`

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

🧾 Решение

abstract class Figure(val color: String) {
    abstract fun area(): Double
    abstract fun perimeter(): Double
}

class Circle(color: String, val radius: Double) : Figure(color) {
    override fun area(): Double = Math.PI * radius * radius
    override fun perimeter(): Double = 2 * Math.PI * radius
}

class Rectangle(color: String, val width: Double, val height: Double) : Figure(color) {
    override fun area(): Double = width * height
    override fun perimeter(): Double = 2 * (width + height)
}

fun main() {
    val figures = listOf(
        Circle(COLOR_BLACK, 5.0),
        Rectangle(COLOR_WHITE, 4.0, 7.0),
        Circle(COLOR_WHITE, 3.0),
        Rectangle(COLOR_BLACK, 2.0, 3.0)
    )

    var totalBlackPerimeter = 0.0
    var totalWhiteArea = 0.0

    figures.forEach { figure ->
        when (figure.color) {
            COLOR_BLACK -> totalBlackPerimeter += figure.perimeter()
            COLOR_WHITE -> totalWhiteArea += figure.area()
        }
    }

    println("Сумма периметров всех черных фигур: $totalBlackPerimeter")
    println("Сумма площадей всех белых фигур: $totalWhiteArea")
}

const val COLOR_BLACK = "black"
const val COLOR_WHITE = "white"