Menu
Coddy logo textTech

Coleção de Formas

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

challenge icon

Desafio

Fácil

Agora que você tem as classes Rectangle e Circle com funcionalidade completa, vamos criar uma classe ShapeCollection que possa gerenciar múltiplas formas juntas. Este é um ótimo exemplo de composição — a coleção "tem" formas em vez de "ser" uma forma.

Você adicionará um novo arquivo ao seu projeto em crescimento:

  • 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: Crie uma nova classe que armazena formas internamente. Inclua um construtor :new() que inicializa uma lista vazia de formas, um método :addShape(shape) que adiciona qualquer forma à coleção e um método :count() que retorna quantas formas estão armazenadas atualmente.
  • main.lua: Reúna tudo importando seus módulos. Leia as dimensões da entrada, crie um Rectangle e um Circle, adicione ambos a uma ShapeCollection, então imprima a contagem da coleção seguida pelo nome de cada forma (na ordem em que foram adicionadas).

A ShapeCollection não precisa saber se está armazenando retângulos ou círculos — ela apenas contém formas. Isso demonstra como o polimorfismo permite tratar diferentes tipos de objetos de maneira uniforme por meio de uma interface comum.

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

Saída: Três linhas — a contagem de formas na coleção, depois o nome da primeira forma adicionada, depois o nome da segunda forma adicionada.

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 contagem de formas na coleção
print(collection:count())

-- Imprime o nome de cada forma na ordem em que foram adicionadas
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Todas as lições de Object Oriented Programming