🗒 Задача¶
Напиши программу для работы с геометрическими фигурами: кругом и прямоугольником. Каждая фигура имеет свой цвет и уникальные параметры:
-
для круга — радиус;
-
для прямоугольника — ширину и высоту.
Создай абстрактный класс Figure с полем color. Внутри определи два абстрактных метода:
-
для вычисления площади;
-
для вычисления периметра.
Добавь классы-наследники для вышеупомянутых типов фигур. Реализуй методы для вычисления площади и периметра в каждом из классов-наследников (формулы можно найти в интернете).
Создай несколько объектов разных цветов (черные и белые) и сохрани в единый список. Выведи в консоль:
-
сумму периметров всех черных фигур;
-
сумму площадей всех белых фигур.
❌ Ошибки¶
-
не выносят текстовые названия цветов в константы
-
не используют
filter()для поиска фигур определенного цвета
✏️ Комментарии¶
Согласно ТЗ требуется создать абстрактный класс. И объявить абстрактные методы внутри. Абстрактные – потому, что экземпляр класса не планирует создаваться и методы не имеют реализации по умолчанию.
Такие имена не стоит использовать. Из контекста не всегда понятно, для чего. Как говорится, код чаще читается чем пишется (и не только тобой), не экономь на символах излишне
Эта переменная есть [в стандартной библиотеке](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.math/-p-i.html). Предлагаю импортнуть ее, чтобы не создавать свою переменную)
Тут и далее по коду: используются изменяемые списки там, где со списком никаких изменений не происходит. Нужно пересмотреть все такие объявления
Для выбора фигур определенного цвета предлагаю воспользоваться функцией `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"