Coleção de Formas
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 59 de 70.
Desafio
FácilAgora 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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas