Menu
Coddy logo textTech

Общая площадь

Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 60 из 70.

challenge icon

Задание

Легко

Давайте добавим мощную функцию в ваш ShapeCollection — возможность вычислять общую площадь всех содержащихся в нем фигур. Именно здесь полиморфизм проявляется во всей красе: ваша коллекция может вызывать :getArea() для любой фигуры, не зная, является ли она прямоугольником или кругом.

Вы продолжите работу над существующими файлами проекта:

  • Shape.lua: Ваш базовый класс Shape (без изменений).
  • Rectangle.lua: Ваш класс Rectangle с методами :getArea() и :getPerimeter().
  • Circle.lua: Ваш класс Circle с методами :getArea() и :getPerimeter().
  • ShapeCollection.lua: Расширьте свой класс коллекции, добавив метод :getTotalArea(). Этот метод должен перебирать все сохраненные фигуры, вызывать :getArea() для каждой из них и возвращать сумму всех площадей.
  • main.lua: Подключите ваши модули, считайте размеры из входных данных, создайте Rectangle и Circle, добавьте оба в ShapeCollection, а затем выведите общую площадь всех фигур в коллекции.

Прелесть этого подхода в том, что :getTotalArea() не требует отдельной логики для прямоугольников и кругов — он просто доверяет тому, что у каждой фигуры в коллекции есть метод :getArea(). Позже вы могли бы добавить треугольники, шестиугольники или любые другие фигуры, и расчет общей площади работал бы без изменений.

Ввод: Три строки — ширина (число), высота (число) и радиус (число).

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

Попробуйте сами

-- Подключить модуль Rectangle
local Rectangle = require('Rectangle')

-- Подключить модуль Circle
local Circle = require('Circle')

-- Подключить модуль ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Прочитать ширину и высоту из ввода
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Создать новый экземпляр Rectangle с заданными размерами
local rect = Rectangle:new(width, height)

-- Создать новый экземпляр Circle с заданным радиусом
local circ = Circle:new(radius)

-- Создать новую коллекцию ShapeCollection
local collection = ShapeCollection:new()

-- Добавить обе фигуры в коллекцию
collection:addShape(rect)
collection:addShape(circ)

-- Вывести общую площадь всех фигур в коллекции
print(collection:getTotalArea())

Все уроки раздела Object Oriented Programming