Menu
Coddy logo textTech

Área Total

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 60 de 70.

challenge icon

Desafio

Fácil

Vamos adicionar um recurso poderoso ao seu ShapeCollection—a capacidade de calcular a área total de todas as formas que ele contém. É aqui que o polimorfismo realmente brilha: sua coleção pode chamar :getArea() em qualquer forma sem saber se é um retângulo ou um círculo.

Você continuará construindo sobre os arquivos do seu projeto existente:

  • Shape.lua: Sua classe base Shape (inalterada).
  • Rectangle.lua: Sua classe Rectangle com :getArea() e :getPerimeter().
  • Circle.lua: Sua classe Circle com :getArea() e :getPerimeter().
  • ShapeCollection.lua: Estenda sua classe de coleção adicionando um método :getTotalArea(). Este método deve iterar por todas as formas armazenadas, chamar :getArea() em cada uma e retornar a soma de todas as áreas.
  • main.lua: Importe seus módulos, leia as dimensões da entrada, crie um Rectangle e um Circle, adicione ambos a um ShapeCollection e, em seguida, imprima a área total de todas as formas na coleção.

A beleza dessa abordagem é que :getTotalArea() não precisa de lógica separada para retângulos e círculos—ele simplesmente confia que cada forma na coleção possui um método :getArea(). Você poderia adicionar triângulos, hexágonos ou qualquer outra forma mais tarde, e o cálculo da área total funcionaria sem modificações.

Entrada: Três linhas—largura (número), altura (número) e raio (número).

Saída: Uma única linha contendo a área total de todas as formas na coleção.

Experimente você mesmo

-- Requer o módulo Rectangle
local Rectangle = require('Rectangle')

-- Requer o módulo Circle
local Circle = require('Circle')

-- Requer o módulo ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Lê a largura e a altura da entrada
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Cria uma nova instância de Rectangle com as dimensões fornecidas
local rect = Rectangle:new(width, height)

-- Cria uma nova instância de Circle com o raio fornecido
local circ = Circle:new(radius)

-- Cria uma nova ShapeCollection
local collection = ShapeCollection:new()

-- Adiciona ambas as formas à coleção
collection:addShape(rect)
collection:addShape(circ)

-- Imprime a área total de todas as formas na coleção
print(collection:getTotalArea())

Todas as lições de Object Oriented Programming