Menu
Coddy logo textTech

Coleção de Formas

Parte da seção Programação Orientada a Objetos 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 várias formas em conjunto. 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 armazene formas internamente. Inclua um construtor :new() que inicialize uma lista vazia de formas, um método :addShape(shape) que adicione qualquer forma à coleção e um método :count() que retorne 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 e, em seguida, imprima a quantidade de formas 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 armazena formas. Isso demonstra como o polimorfismo permite tratar diferentes tipos de objetos uniformemente 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 quantidade de formas na coleção, depois o nome da primeira forma adicionada e, em seguida, 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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online